void CFactorGraphModel::w_to_fparams(SGVector<float64_t> w) { // if nothing changed if (m_w_cache.equals(w)) return; if (m_verbose) SG_SPRINT("****** update m_w_cache!\n"); ASSERT(w.size() == m_w_cache.size()); m_w_cache = w.clone(); int32_t offset = 0; for (int32_t fi = 0; fi < m_factor_types->get_num_elements(); ++fi) { CFactorType* ftype = dynamic_cast<CFactorType*>(m_factor_types->get_element(fi)); int32_t w_dim = ftype->get_w_dim(); offset += w_dim; SGVector<float64_t> fw(w_dim); SGVector<int32_t> fw_map = get_params_mapping(ftype->get_type_id()); for (int32_t wi = 0; wi < w_dim; wi++) fw[wi] = m_w_cache[fw_map[wi]]; ftype->set_w(fw); SG_UNREF(ftype); } ASSERT(offset == m_w_cache.size()); }
float64_t CMahalanobisDistance::compute(int32_t idx_a, int32_t idx_b) { SGVector<float64_t> bvec = ((CDenseFeatures<float64_t>*) rhs)-> get_feature_vector(idx_b); SGVector<float64_t> diff; SGVector<float64_t> avec; if (use_mean) diff = mean.clone(); else { avec = ((CDenseFeatures<float64_t>*) lhs)->get_feature_vector(idx_a); diff=avec.clone(); } ASSERT(diff.vlen == bvec.vlen); for (int32_t i=0; i < diff.vlen; i++) diff[i] = bvec.vector[i] - diff[i]; SGVector<float64_t> v = diff.clone(); cblas_dgemv(CblasColMajor, CblasNoTrans, icov.num_rows, icov.num_cols, 1.0, icov.matrix, diff.vlen, diff.vector, 1, 0.0, v.vector, 1); float64_t result = cblas_ddot(v.vlen, v.vector, 1, diff.vector, 1); if (!use_mean) ((CDenseFeatures<float64_t>*) lhs)->free_feature_vector(avec, idx_a); ((CDenseFeatures<float64_t>*) rhs)->free_feature_vector(bvec, idx_b); if (disable_sqrt) return result; else return CMath::sqrt(result); }
void CFactorDataSource::set_data(SGVector<float64_t> dense) { m_dense = dense.clone(); }
void CFactor::set_data(SGVector<float64_t> data_dense) { m_data = data_dense.clone(); m_is_data_dep = true; }
void CFactor::set_variables(SGVector<int32_t> vars) { m_var_index = vars.clone(); }
} bool CKNN::train_machine(CFeatures* data) { ASSERT(m_labels) ASSERT(distance) if (data) { if (m_labels->get_num_labels() != data->get_num_vectors()) SG_ERROR("Number of training vectors does not match number of labels\n") distance->init(data, data); } SGVector<int32_t> lab=((CMulticlassLabels*) m_labels)->get_int_labels(); m_train_labels=lab.clone(); ASSERT(m_train_labels.vlen>0) int32_t max_class=m_train_labels[0]; int32_t min_class=m_train_labels[0]; for (int32_t i=1; i<m_train_labels.vlen; i++) { max_class=CMath::max(max_class, m_train_labels[i]); min_class=CMath::min(min_class, m_train_labels[i]); } for (int32_t i=0; i<m_train_labels.vlen; i++) m_train_labels[i]-=min_class; m_min_label=min_class;
void CFactorGraph::set_cardinalities(SGVector<int32_t> cards) { m_cardinalities = cards.clone(); }