/** * Unpacks the gain matrix for a specific time t. * * This could be pre-computed if it becomes a performance bottleneck. * * @param t time along the trajectory * * @retval gain matrix at that time with dimension: state_dimension x u_dimension */ Eigen::MatrixXd Trajectory::GetGainMatrix(double t) { int index = GetIndexFromTime(t); Eigen::VectorXd k_row = kpoints_.row(index); Eigen::MatrixXd k_mat(udimension_, dimension_); for (int i = 0; i < udimension_; i++) { // +1 because the column index is time int start_pos = i * dimension_ + 1; k_mat.row(i) = k_row.segment(start_pos, dimension_); } return k_mat; }
void NuSVC::train_binary(const DataSet &dataset, int i, int j, SyncArray<float_type> &alpha, float_type &rho) { DataSet::node2d ins = dataset.instances(i, j);//get instances of class i and j int n_pos = dataset.count()[i]; int n_neg = dataset.count()[j]; SyncArray<int> y(ins.size()); alpha.resize(ins.size()); SyncArray<float_type> f_val(ins.size()); alpha.mem_set(0); f_val.mem_set(0); float_type sum_pos = param.nu * ins.size() / 2; float_type sum_neg = sum_pos; int *y_data = y.host_data(); float_type *alpha_data = alpha.host_data(); for (int l = 0; l < n_pos; ++l) { y_data[l] = +1; alpha_data[l] = min(1., sum_pos); sum_pos -= alpha_data[l]; } for (int l = 0; l < n_neg; ++l) { y_data[n_pos + l] = -1; alpha_data[n_pos + l] = min(1., sum_neg); sum_neg -= alpha_data[n_pos + l]; } vector<int> ori = dataset.original_index(i, j); KernelMatrix k_mat(ins, param); int ws_size = get_working_set_size(ins.size(), k_mat.n_features()); NuSMOSolver solver(false); solver.solve(k_mat, y, alpha, rho, f_val, param.epsilon, 1, 1, ws_size, max_iter); LOG(INFO)<<"rho = "<<rho; int n_sv = 0; alpha_data = alpha.host_data(); for (int l = 0; l < alpha.size(); ++l) { alpha_data[l] *= y_data[l]; if (alpha_data[l] != 0) n_sv++; } LOG(INFO)<<"#sv = "<<n_sv; }