
time_s <- as.numeric(Sys.time())

## libs
library(ggplot2)
library(data.table)
library(Metrics)
library(FNN)

mp <- function(place_id,popularity,index){place_id[order(popularity,decreasing=T)][index]}


### read data
require(bit64)
train_dt <- fread("../input/train.csv")
test_dt <- fread("../input/test.csv")


### test prediction

train_dt$x <- round((train_dt$x*30))
train_dt$y <- round((train_dt$y*200))
train_dt$accuracy_r <- ifelse(train_dt$accuracy<200,1,2)

test_dt$x <- round((test_dt$x*30))
test_dt$y <- round((test_dt$y*200))
test_dt$accuracy_r <- ifelse(test_dt$accuracy<200,1,2)



popular_places_dt <- train_dt[,.(popularity=length(time)),by=list(x,y,place_id,accuracy_r)][order(x,y)]

rm(train_dt)
gc()



most_popular_place_for_xy <- popular_places_dt[,.(mp1=mp(place_id,popularity,1),
                                                  mp2=mp(place_id,popularity,2),
                                                  mp3=mp(place_id,popularity,3)),by=list(x,y,accuracy_r)]

print("Merging with Test ...")
test_dt <- merge(test_dt,most_popular_place_for_xy,by=c("x","y","accuracy_r"),all.x = T, sort = F)


### generate submission
pred_list_mat <- cbind(test_dt$mp1,test_dt$mp2,test_dt$mp3)

final_pred_list <- apply(pred_list_mat,1,function(x){paste(as.character.integer64(x),collapse=" ")})

submission_df <- data.frame(row_id=test_dt$row_id, place_id=final_pred_list)

sub_file_name <- "most_popular-3.csv"
write.csv(submission_df, sub_file_name, quote = F, row.names = F)


print(paste("Exec time:",(as.numeric(Sys.time())-time_s)/60))