evanwang1990 / FMwR

FMwR: A Library of Factorization Machines in R Based on libfm
GNU General Public License v3.0
7 stars 3 forks source link

segmentation fault #2

Closed dselivanov closed 7 years ago

dselivanov commented 7 years ago

Got segmentation fault (fwmr_segfault.rds data file to reproduce is here).

segmentation fault for ALS, MCMC solvers with any number of threads.

library(FMwR)
load("fwmr_segfault.rds")
solver  = ALS.solver(alpha_0   = 1.0,
                     gamma_0   = 1.0,
                     beta_0    = 1.0,
                     mu_0      = 0.0,
                     alpha     = 1.0,
                     w0_mean_0 = 1.0)

m_fm_train = fm.matrix(train$m, as.numeric(train$y), feature_names = as.character(1:ncol(train$m)))
m_fm_test = fm.matrix(test$m, as.numeric(test$y), feature_names = as.character(1:ncol(train$m)))

control_lst = list(track.control(step_size = 1),
     solver.control(solver = solver, max_iter = 10),
     model.control(L1.w1 = 10, L2.w1 = 10, L1.v = 1, factor.number = 2))

fm_fit = fm.train(m_fm_train, control = control_lst, max_threads = 1)

caught segfault address 0x7f098ebde9c0, cause 'memory not mapped' Traceback: 1: .Call("FMwRFM", PACKAGE = "FMwR", data, normalize, fm_controls, solver_controls, track_controls, model_list) 2: FM(data, normalize - 1, fm_controls = control_default$model, solver_controls = control_default$solver, track_controls = control_default$track, list()) 3: fm.train.fm.matrix(m_fm_train, control = control_lst, max_threads = 1) 4: fm.train(m_fm_train, control = control_lst, max_threads = 1)

dselivanov commented 7 years ago

In fact no segfault when I set normalize = F.

evanwang1990 commented 7 years ago

The bugs for normalize=T have been fixed, and some new functions have been added. Please install the latest version and have a try.

library(FMwR)
load("~/Downloads/fwmr_segfault.rds")
solver  = ALS.solver(alpha_0   = 1.0,
                     gamma_0   = 1.0,
                     beta_0    = 1.0,
                     mu_0      = 0.0,
                     alpha     = 1.0,
                     w0_mean_0 = 1.0)
m_fm_train = fm.matrix(train$m, as.numeric(train$y), feature_names = as.character(1:ncol(train$m)))
m_fm_test = fm.matrix(test$m, as.numeric(test$y), feature_names = as.character(1:ncol(train$m)))

control_lst = list(track.control(step_size = 1),
                   solver.control(solver = solver, max_iter = 10),
                   model.control(L1.w1 = 10, L2.w1 = 10, L1.v = 1, factor.number = 2))

fm.set_threads(2)
fm_fit = fm.train(m_fm_train, normalize = T, control = control_lst)

fm_track <- fm.track(fm_fit, m_fm_train, m_fm_test, evaluate.metric = "ACC")
plot(fm_track)

best_fit <- fm.select(fm_fit, trace = fm_track, drop.trace = T)
fm_pred <- predict(best_fit, normalize = T, m_fm_test)
table(m_fm_test$labels, fm_pred > 0.5)
dselivanov commented 7 years ago

thanks! works now.