My Project
unified_optimization.hpp
Go to the documentation of this file.
1 #pragma once
2 
3 #include "iteration_recorder.hpp"
4 #include "network_wrapper.hpp"
5 #include "seed.hpp"
6 #include <Eigen/Core>
7 #include <algorithm>
8 #include <chrono>
9 #include <fstream>
10 #include <iostream>
11 #include <memory>
12 #include <string>
13 #include <type_traits>
14 #include <vector>
15 
16 // CPU Headers
17 #include "minimizer/gd.hpp"
18 #include "minimizer/lbfgs.hpp"
19 #include "minimizer/s_gd.hpp"
20 #include "minimizer/s_lbfgs.hpp"
21 
26 struct UnifiedConfig {
27  std::string name = "Experiment";
28 
29  int max_iters = 100;
30  double tolerance = 1e-4;
31  double learning_rate = 0.01;
32  double momentum = 0.0;
33  double lr_decay = 0.0;
34  int lr_decay_rate = 1;
35 
36  // Stochastic params
37  int batch_size = 128;
38  int m_param = 10;
39  int L_param = 10;
40  int b_H_param = 0;
41 
42  // Logging
43  int log_interval = 10;
44 
45  // Parameter initialization
46  bool reset_params = true;
47  unsigned int seed = kDefaultSeed;
48 };
49 
55  Eigen::MatrixXd train_x;
56  Eigen::MatrixXd train_y;
57  Eigen::MatrixXd test_x;
58  Eigen::MatrixXd test_y;
59 };
60 
61 inline std::string cpu_log_filename(const UnifiedConfig &config) {
62  std::string base = config.name.empty() ? "run" : config.name;
63  return base + "_history.csv";
64 }
65 
67  const std::string &filename, const IterationRecorder<CpuBackend> &recorder, int log_interval) {
68  if (log_interval <= 0) return;
69  std::vector<double> loss_hist;
70  std::vector<double> grad_hist;
71  std::vector<double> time_hist;
72  recorder.copy_to_host(loss_hist, grad_hist, time_hist);
73  if (loss_hist.empty()) return;
74 
75  std::ofstream log_file(filename);
76  if (!log_file.is_open()) return;
77  log_file << "Iteration,Loss,GradNorm,TimeMs\n";
78  int stride = std::max(1, log_interval);
79  for (size_t i = 0; i < loss_hist.size(); i += static_cast<size_t>(stride)) {
80  double loss = loss_hist[i];
81  double grad = (i < grad_hist.size()) ? grad_hist[i] : 0.0;
82  double time_ms = (i < time_hist.size()) ? time_hist[i] : 0.0;
83  log_file << i << "," << loss << "," << grad << "," << time_ms << "\n";
84  }
85 }
86 
88  const UnifiedDataset &data,
90  using Vec = Eigen::VectorXd;
91  using Mat = Eigen::MatrixXd;
92 
93  auto &network = net.getInternal();
94  size_t params_size = network.getSize();
95 
96  Vec weights(params_size);
97  std::copy(network.getParamsData(), network.getParamsData() + params_size, weights.data());
98 
99  const double inv_samples = (data.train_x.cols() > 0) ? (1.0 / static_cast<double>(data.train_x.cols())) : 0.0;
100 
101  VecFun<Vec, double> f = [&](Vec w) -> double {
102  network.setParams(w);
103  const auto &output = network.forward(data.train_x);
104  Mat diff = output - data.train_y;
105  double loss = 0.5 * diff.squaredNorm();
106  if (inv_samples != 0.0) loss *= inv_samples;
107  return loss;
108  };
109 
110  GradFun<Vec> grad = [&](Vec w) -> Vec {
111  network.setParams(w);
112  network.zeroGrads();
113  const auto &output = network.forward(data.train_x);
114  Mat diff = output - data.train_y;
115  network.backward(diff);
116  Vec g(params_size);
117  network.getGrads(g);
118  if (inv_samples != 0.0) g *= inv_samples;
119  return g;
120  };
121 
122  Vec final_weights = minimizer.solve(weights, f, grad);
123  network.setParams(final_weights);
124 }
125 
126 // -----------------------------------------------------------
127 // Abstract Strategy Wrapper
128 // -----------------------------------------------------------
129 
135 template <typename Backend> class UnifiedOptimizer;
136 
137 // =================================================================================================
138 // CPU BACKEND
139 // =================================================================================================
140 
144 template <> class UnifiedOptimizer<CpuBackend> {
145 public:
146  virtual ~UnifiedOptimizer() = default;
147 
154  virtual void optimize(NetworkWrapper<CpuBackend> &net, const UnifiedDataset &data, const UnifiedConfig &config) = 0;
155 };
156 
161 class UnifiedGD_CPU : public UnifiedOptimizer<CpuBackend> {
162 public:
169  void optimize(NetworkWrapper<CpuBackend> &net, const UnifiedDataset &data, const UnifiedConfig &config) override {
170  using Vec = Eigen::VectorXd;
171  using Mat = Eigen::MatrixXd;
172 
173  auto minimizer = std::make_shared<cpu_mlp::GradientDescent<Vec, Mat>>();
174  minimizer->setMaxIterations(config.max_iters);
175  minimizer->setTolerance(config.tolerance);
176  minimizer->setStepSize(config.learning_rate);
177  minimizer->useLineSearch(false);
179  recorder.init(config.max_iters);
180  minimizer->setRecorder(&recorder);
181 
182  run_full_batch_cpu(net, data, *minimizer);
183  write_cpu_history_csv(cpu_log_filename(config), recorder, config.log_interval);
184  }
185 };
186 
191 class UnifiedLBFGS_CPU : public UnifiedOptimizer<CpuBackend> {
192 public:
199  void optimize(NetworkWrapper<CpuBackend> &net, const UnifiedDataset &data, const UnifiedConfig &config) override {
200  using Vec = Eigen::VectorXd;
201  using Mat = Eigen::MatrixXd;
202 
203  auto minimizer = std::make_shared<cpu_mlp::LBFGS<Vec, Mat>>();
204  minimizer->setMaxIterations(config.max_iters);
205  minimizer->setTolerance(config.tolerance);
206  minimizer->setHistorySize(config.m_param > 0 ? config.m_param : 10);
208  recorder.init(config.max_iters);
209  minimizer->setRecorder(&recorder);
210 
211  run_full_batch_cpu(net, data, *minimizer);
212  write_cpu_history_csv(cpu_log_filename(config), recorder, config.log_interval);
213  }
214 };
215 
220 class UnifiedSGD_CPU : public UnifiedOptimizer<CpuBackend> {
221 public:
228  void optimize(NetworkWrapper<CpuBackend> &net, const UnifiedDataset &data, const UnifiedConfig &config) override {
229  using Vec = Eigen::VectorXd;
230  using Mat = Eigen::MatrixXd;
231 
232  auto minimizer = std::make_shared<cpu_mlp::StochasticGradientDescent<Vec, Mat>>();
233  minimizer->setMaxIterations(config.max_iters);
234  minimizer->setStepSize(config.learning_rate);
235 
237  recorder.init(config.max_iters);
238  minimizer->setRecorder(&recorder);
239 
240  std::cout << "Starting Batch SGD (CPU Optimized)..." << std::endl;
241 
242  int m = static_cast<int>(data.train_x.cols()) / config.batch_size;
243  if (m == 0) m = 1;
244 
245  auto &network = net.getInternal();
246  size_t params_size = network.getSize();
247 
248  Vec weights(params_size);
249  std::copy(network.getParamsData(), network.getParamsData() + params_size, weights.data());
250 
251  long input_rows = data.train_x.rows();
252  long output_rows = data.train_y.rows();
253 
254  Mat batch_x_buffer(input_rows, config.batch_size);
255  Mat batch_y_buffer(output_rows, config.batch_size);
256 
257  auto batch_g = [&](const Vec &w, const std::vector<size_t> &indices, Vec &grad) mutable {
258  network.setParams(w);
259  network.zeroGrads();
260 
261  long current_bs = indices.size();
262 
263  if (batch_x_buffer.cols() != current_bs) {
264  batch_x_buffer.resize(input_rows, current_bs);
265  batch_y_buffer.resize(output_rows, current_bs);
266  }
267 
268  for (long i = 0; i < current_bs; ++i) {
269  batch_x_buffer.col(i) = data.train_x.col(indices[i]);
270  batch_y_buffer.col(i) = data.train_y.col(indices[i]);
271  }
272 
273  const auto &output = network.forward(batch_x_buffer);
274 
275  Mat diff = output - batch_y_buffer;
276  network.backward(diff);
277 
278  network.getGrads(grad);
279  grad /= static_cast<double>(current_bs);
280  };
281 
282  auto f_single = [&](const Vec &w, const Vec &x, const Vec &y) -> double {
283  network.setParams(w);
284  Eigen::MatrixXd input_mat(x.size(), 1);
285  input_mat.col(0) = x;
286  const auto &output = network.forward(input_mat);
287  return 0.5 * (output.col(0) - y).squaredNorm();
288  };
289 
290  minimizer->setData(data.train_x, data.train_y, f_single, batch_g);
291 
292  Vec final_weights = minimizer->stochastic_solve(weights,
293  m,
294  config.batch_size,
295  config.learning_rate,
296  true, // verbose
297  config.log_interval);
298  write_cpu_history_csv(cpu_log_filename(config), recorder, config.log_interval);
299  }
300 };
301 
306 class UnifiedSLBFGS_CPU : public UnifiedOptimizer<CpuBackend> {
307 public:
314  void optimize(NetworkWrapper<CpuBackend> &net, const UnifiedDataset &data, const UnifiedConfig &config) override {
315  using Vec = Eigen::VectorXd;
316  using Mat = Eigen::MatrixXd;
317 
318  auto minimizer = std::make_shared<cpu_mlp::SLBFGS<Vec, Mat>>();
319  minimizer->setMaxIterations(config.max_iters);
320  minimizer->setTolerance(config.tolerance);
322  recorder.init(config.max_iters);
323  minimizer->setRecorder(&recorder);
324 
325  int b_H = config.b_H_param > 0 ? config.b_H_param : config.batch_size / 2;
326  int m = data.train_x.cols() / config.batch_size;
327  if (m == 0) m = 1;
328 
329  auto &network = net.getInternal();
330  size_t params_size = network.getSize();
331 
332  Vec weights(params_size);
333  std::copy(network.getParamsData(), network.getParamsData() + params_size, weights.data());
334  double lambda = 1e-4;
335 
336  long input_rows = data.train_x.rows();
337  long output_rows = data.train_y.rows();
338  int N = data.train_x.cols();
339 
340  Mat batch_x_buffer(input_rows, std::max(config.batch_size, 128));
341  Mat batch_y_buffer(output_rows, std::max(config.batch_size, 128));
342 
343  auto batch_g = [&](const Vec &w, const std::vector<size_t> &indices, Vec &grad) mutable {
344  network.setParams(w);
345  network.zeroGrads();
346 
347  long current_bs = indices.size();
348 
349  if (batch_x_buffer.cols() < current_bs) {
350  batch_x_buffer.resize(input_rows, current_bs);
351  batch_y_buffer.resize(output_rows, current_bs);
352  }
353 
354  bool is_full_batch = (current_bs == N);
355 
356  if (is_full_batch) {
357  const auto &output = network.forward(data.train_x);
358  Mat diff = output - data.train_y;
359  network.backward(diff);
360  } else {
361  for (long i = 0; i < current_bs; ++i) {
362  batch_x_buffer.col(i) = data.train_x.col(indices[i]);
363  batch_y_buffer.col(i) = data.train_y.col(indices[i]);
364  }
365  auto x_view = batch_x_buffer.leftCols(current_bs);
366  auto y_view = batch_y_buffer.leftCols(current_bs);
367 
368  const auto &output = network.forward(x_view);
369  Mat diff = output - y_view;
370  network.backward(diff);
371  }
372 
373  network.getGrads(grad);
374  grad /= static_cast<double>(current_bs);
375  grad.array() += lambda * w.array();
376  };
377 
378  auto batch_f = [&](const Vec &w, const std::vector<size_t> &indices) -> double {
379  network.setParams(w);
380  long current_bs = indices.size();
381 
382  if (batch_x_buffer.cols() < current_bs) {
383  batch_x_buffer.resize(input_rows, current_bs);
384  batch_y_buffer.resize(output_rows, current_bs);
385  }
386 
387  for (long i = 0; i < current_bs; ++i) {
388  batch_x_buffer.col(i) = data.train_x.col(indices[i]);
389  batch_y_buffer.col(i) = data.train_y.col(indices[i]);
390  }
391  auto x_view = batch_x_buffer.leftCols(current_bs);
392  auto y_view = batch_y_buffer.leftCols(current_bs);
393 
394  const auto &output = network.forward(x_view);
395  Vec diff_sq = (output - y_view).colwise().squaredNorm();
396  double loss = 0.5 * diff_sq.sum();
397  loss /= current_bs;
398  loss += 0.5 * lambda * w.squaredNorm();
399  return loss;
400  };
401 
402  minimizer->setData(batch_f, batch_g);
403 
404  Vec final_weights = minimizer->stochastic_solve(
405  weights, batch_f, batch_g, m, config.m_param, config.L_param, config.batch_size, b_H, config.learning_rate, N);
406  write_cpu_history_csv(cpu_log_filename(config), recorder, config.log_interval);
407  }
408 };
409 
410 #ifdef __CUDACC__
411  #include "cuda/device_buffer.cuh"
412  #include "cuda/gd.cuh"
413  #include "cuda/lbfgs.cuh"
414  #include "cuda/sgd.cuh"
415  #include "iteration_recorder.hpp"
416 
420 template <> class UnifiedOptimizer<CudaBackend> {
421 public:
422  virtual ~UnifiedOptimizer() = default;
423 
433  virtual void optimize(cuda_mlp::CublasHandle &handle,
435  const UnifiedDataset &host_data,
438  const UnifiedConfig &config) = 0;
439 };
440 
441 inline std::string cuda_log_filename(const UnifiedConfig &config) {
442  std::string base = config.name.empty() ? "run" : config.name;
443  return base + "_history.csv";
444 }
445 
446 inline void write_cuda_history_csv(
447  const std::string &filename, const IterationRecorder<CudaBackend> &recorder, int log_interval) {
448  if (log_interval <= 0) return;
449  std::vector<cuda_mlp::CudaScalar> loss_hist;
450  std::vector<cuda_mlp::CudaScalar> grad_hist;
451  std::vector<cuda_mlp::CudaScalar> time_hist;
452  recorder.copy_to_host(loss_hist, grad_hist, time_hist);
453  if (loss_hist.empty()) return;
454 
455  std::ofstream log_file(filename);
456  if (!log_file.is_open()) return;
457  log_file << "Iteration,Loss,GradNorm,TimeMs\n";
458  int stride = std::max(1, log_interval);
459  for (size_t i = 0; i < loss_hist.size(); i += static_cast<size_t>(stride)) {
460  cuda_mlp::CudaScalar loss = loss_hist[i];
461  cuda_mlp::CudaScalar grad = (i < grad_hist.size()) ? grad_hist[i] : static_cast<cuda_mlp::CudaScalar>(0);
462  cuda_mlp::CudaScalar time_ms = (i < time_hist.size()) ? time_hist[i] : static_cast<cuda_mlp::CudaScalar>(0);
463  log_file << i << "," << loss << "," << grad << "," << time_ms << "\n";
464  }
465 }
466 
470 template <typename SolverFactory>
471 inline void run_cuda_solver_once(SolverFactory make_solver,
475  const UnifiedDataset &dataset,
476  const UnifiedConfig &config) {
477  using namespace cuda_mlp;
478  DeviceBuffer<CudaScalar> initial_params(net.params_size());
479  if (net.params_size() > 0) {
480  device_copy(initial_params.data(), net.params_data(), net.params_size());
481  }
482 
483  auto loss_grad = [&](const CudaScalar *params,
484  CudaScalar *grad,
485  const CudaScalar *input,
486  const CudaScalar *target,
487  int batch) -> CudaScalar {
488  CudaScalar loss = net.compute_loss_and_grad(input, target, batch);
489  device_copy(grad, net.grads_data(), net.params_size());
490  return loss;
491  };
492 
493  if (net.params_size() > 0) {
494  device_copy(net.params_data(), initial_params.data(), net.params_size());
495  }
496 
497  auto solver = make_solver();
499  recorder.init(config.max_iters);
500  solver->setRecorder(&recorder);
501 
502  auto start_time = std::chrono::steady_clock::now();
503  solver->solve(net.params_size(),
504  net.params_data(),
505  d_train_x.data(),
506  d_train_y.data(),
507  static_cast<int>(dataset.train_x.cols()),
508  loss_grad);
509  cudaDeviceSynchronize();
510  auto end_time = std::chrono::steady_clock::now();
511  (void)start_time;
512  (void)end_time;
513 
514  write_cuda_history_csv(cuda_log_filename(config), recorder, config.log_interval);
515 }
516 
521 class UnifiedGD_CUDA : public UnifiedOptimizer<CudaBackend> {
522 public:
532  void optimize(cuda_mlp::CublasHandle &handle,
534  const UnifiedDataset &d,
537  const UnifiedConfig &c) override {
538  using namespace cuda_mlp;
539  run_cuda_solver_once(
540  [&]() {
541  auto solver = std::make_unique<CudaGD>(handle);
542  solver->setLearningRate(c.learning_rate);
543  solver->setMomentum(c.momentum);
544  solver->setMaxIterations(c.max_iters);
545  solver->setTolerance(c.tolerance);
546  return solver;
547  },
548  net.getInternal(),
549  dx,
550  dy,
551  d,
552  c);
553  }
554 };
555 
560 class UnifiedLBFGS_CUDA : public UnifiedOptimizer<CudaBackend> {
561 public:
571  void optimize(cuda_mlp::CublasHandle &handle,
573  const UnifiedDataset &d,
576  const UnifiedConfig &c) override {
577  using namespace cuda_mlp;
578  run_cuda_solver_once(
579  [&]() {
580  auto solver = std::make_unique<CudaLBFGS>(handle);
581  solver->setMemory(c.m_param);
582  solver->setMaxIterations(c.max_iters);
583  solver->setTolerance(c.tolerance);
584  return solver;
585  },
586  net.getInternal(),
587  dx,
588  dy,
589  d,
590  c);
591  }
592 };
593 
598 class UnifiedSGD_CUDA : public UnifiedOptimizer<CudaBackend> {
599 public:
609  void optimize(cuda_mlp::CublasHandle &handle,
611  const UnifiedDataset &d,
614  const UnifiedConfig &c) override {
615  using namespace cuda_mlp;
616  run_cuda_solver_once(
617  [&]() {
618  auto solver = std::make_unique<CudaSGD>(handle);
619  solver->setLearningRate(c.learning_rate);
620  solver->setMomentum(c.momentum);
621  solver->setBatchSize(c.batch_size);
622  solver->setMaxIterations(c.max_iters);
623  solver->setLearningRateDecay(c.lr_decay, c.lr_decay_rate);
624  solver->setDimensions(static_cast<int>(d.train_x.rows()), static_cast<int>(d.train_y.rows()));
625  return solver;
626  },
627  net.getInternal(),
628  dx,
629  dy,
630  d,
631  c);
632  }
633 };
634 
639 template <typename T> class UnavailableOptimizer {
640  static_assert(sizeof(T) == 0, "This Optimizer is NOT available on the current Backend (e.g. SLBFGS is CPU-only).");
641 };
642 
643 #endif
644 
648 template <typename Backend>
649 using UnifiedGD = typename std::conditional<std::is_same<Backend, CpuBackend>::value,
651 #ifdef __CUDACC__
652  UnifiedGD_CUDA
653 #else
654  void
655 #endif
656  >::type;
657 
661 template <typename Backend>
662 using UnifiedLBFGS = typename std::conditional<std::is_same<Backend, CpuBackend>::value,
664 #ifdef __CUDACC__
665  UnifiedLBFGS_CUDA
666 #else
667  void
668 #endif
669  >::type;
670 
674 template <typename Backend>
675 using UnifiedSGD = typename std::conditional<std::is_same<Backend, CpuBackend>::value,
677 #ifdef __CUDACC__
678  UnifiedSGD_CUDA
679 #else
680  void
681 #endif
682  >::type;
683 
688 template <typename Backend>
689 using UnifiedSLBFGS = typename std::conditional<std::is_same<Backend, CpuBackend>::value,
691 #ifdef __CUDACC__
692  UnavailableOptimizer<Backend>
693 #else
694  void
695 #endif
696  >::type;
CPU recorder that stores loss/gradient history on host.
Definition: iteration_recorder.hpp:18
void copy_to_host(std::vector< double > &loss_out, std::vector< double > &grad_norm_out) const
Copy recorded loss and gradient norm to output vectors.
Definition: iteration_recorder.hpp:50
void init(int capacity)
Allocate buffers for up to capacity iterations.
Definition: iteration_recorder.hpp:21
CPU specialization of the network wrapper.
Definition: network_wrapper.hpp:60
InternalNetwork & getInternal()
Access the underlying CPU network.
Definition: network_wrapper.hpp:72
Definition: network_wrapper.hpp:55
Standard Gradient Descent implementation for CPU.
Definition: unified_optimization.hpp:161
void optimize(NetworkWrapper< CpuBackend > &net, const UnifiedDataset &data, const UnifiedConfig &config) override
Optimize the network using Gradient Descent on CPU.
Definition: unified_optimization.hpp:169
L-BFGS implementation for CPU.
Definition: unified_optimization.hpp:191
void optimize(NetworkWrapper< CpuBackend > &net, const UnifiedDataset &data, const UnifiedConfig &config) override
Optimize the network using L-BFGS on CPU.
Definition: unified_optimization.hpp:199
virtual void optimize(NetworkWrapper< CpuBackend > &net, const UnifiedDataset &data, const UnifiedConfig &config)=0
Executes the optimization strategy.
virtual ~UnifiedOptimizer()=default
Abstract base class for backend-specific optimizer strategies.
Definition: unified_optimization.hpp:135
Stochastic Gradient Descent implementation for CPU (Optimized with Batch Matrix Ops).
Definition: unified_optimization.hpp:220
void optimize(NetworkWrapper< CpuBackend > &net, const UnifiedDataset &data, const UnifiedConfig &config) override
Optimize the network using Stochastic Gradient Descent on CPU.
Definition: unified_optimization.hpp:228
Stochastic L-BFGS implementation for CPU.
Definition: unified_optimization.hpp:306
void optimize(NetworkWrapper< CpuBackend > &net, const UnifiedDataset &data, const UnifiedConfig &config) override
Optimize the network using Stochastic L-BFGS on CPU.
Definition: unified_optimization.hpp:314
Base class for Full Batch Minimizers.
Definition: full_batch_minimizer.hpp:23
virtual V solve(V x, VecFun< V, double > &f, GradFun< V > &Gradient)=0
Performs optimization.
size_t getSize() const
Total number of parameters.
Definition: network.hpp:36
RAII-managed cuBLAS handle.
Definition: cublas_handle.cuh:22
Feed-forward dense network with GPU-backed parameters and gradients.
Definition: network.cuh:16
size_t params_size() const
Total number of parameters.
Definition: network.cuh:62
CudaScalar compute_loss_and_grad(const CudaScalar *input, const CudaScalar *target, int batch)
Compute MSE loss and gradients for a batch.
Definition: network.cuh:97
CudaScalar * grads_data()
Mutable device pointer to gradients.
Definition: network.cuh:69
CudaScalar * params_data()
Mutable device pointer to parameters.
Definition: network.cuh:67
Owning buffer for device memory.
Definition: device_buffer.cuh:7
T * data()
Mutable raw pointer to device memory.
Definition: device_buffer.cuh:68
std::function< T(T)> GradFun
Gradient function type alias (T -> T).
Definition: common.hpp:32
std::function< W(T)> VecFun
Objective function type alias (T -> W).
Definition: common.hpp:35
Definition: common.cuh:8
void device_copy(CudaScalar *dst, const CudaScalar *src, size_t n)
Copy device-to-device.
Definition: kernels.cuh:24
float CudaScalar
Scalar type used across CUDA kernels and optimizers.
Definition: common.cuh:11
Backend-agnostic wrapper for CPU/CUDA networks.
constexpr unsigned int kDefaultSeed
Definition: seed.hpp:4
Backend tag for CPU implementations.
Definition: network_wrapper.hpp:20
Backend tag for CUDA implementations.
Definition: network_wrapper.hpp:22
Configuration parameters for training experiments.
Definition: unified_optimization.hpp:26
int lr_decay_rate
Definition: unified_optimization.hpp:34
unsigned int seed
Definition: unified_optimization.hpp:47
double lr_decay
Definition: unified_optimization.hpp:33
int max_iters
Definition: unified_optimization.hpp:29
bool reset_params
Definition: unified_optimization.hpp:46
int log_interval
Definition: unified_optimization.hpp:43
int b_H_param
Definition: unified_optimization.hpp:40
int batch_size
Definition: unified_optimization.hpp:37
double tolerance
Definition: unified_optimization.hpp:30
int L_param
Definition: unified_optimization.hpp:39
double learning_rate
Definition: unified_optimization.hpp:31
double momentum
Definition: unified_optimization.hpp:32
int m_param
Definition: unified_optimization.hpp:38
std::string name
Definition: unified_optimization.hpp:27
Container for training and test data.
Definition: unified_optimization.hpp:54
Eigen::MatrixXd test_x
Definition: unified_optimization.hpp:57
Eigen::MatrixXd train_x
Definition: unified_optimization.hpp:55
Eigen::MatrixXd test_y
Definition: unified_optimization.hpp:58
Eigen::MatrixXd train_y
Definition: unified_optimization.hpp:56
typename std::conditional< std::is_same< Backend, CpuBackend >::value, UnifiedSLBFGS_CPU, void >::type UnifiedSLBFGS
Unified alias for Stochastic L-BFGS (CPU ONLY). Triggers compile-time error if used with CudaBackend.
Definition: unified_optimization.hpp:696
typename std::conditional< std::is_same< Backend, CpuBackend >::value, UnifiedLBFGS_CPU, void >::type UnifiedLBFGS
Unified alias for L-BFGS (CPU & CUDA).
Definition: unified_optimization.hpp:669
void write_cpu_history_csv(const std::string &filename, const IterationRecorder< CpuBackend > &recorder, int log_interval)
Definition: unified_optimization.hpp:66
typename std::conditional< std::is_same< Backend, CpuBackend >::value, UnifiedSGD_CPU, void >::type UnifiedSGD
Unified alias for Stochastic Gradient Descent (CPU & CUDA).
Definition: unified_optimization.hpp:682
std::string cpu_log_filename(const UnifiedConfig &config)
Definition: unified_optimization.hpp:61
void run_full_batch_cpu(NetworkWrapper< CpuBackend > &net, const UnifiedDataset &data, cpu_mlp::FullBatchMinimizer< Eigen::VectorXd, Eigen::MatrixXd > &minimizer)
Definition: unified_optimization.hpp:87
typename std::conditional< std::is_same< Backend, CpuBackend >::value, UnifiedGD_CPU, void >::type UnifiedGD
Unified alias for Gradient Descent (CPU & CUDA).
Definition: unified_optimization.hpp:656