2014-01-24 1 views
2

Я работаю с пакетом «igraph» и функцией «evalWithTimeout» в «R.utils».evalWithTimeout игнорируется при вызове подпрограмм C/Fortran?

Я пытаюсь выполнить максимальное обнаружение клики, которое, как я знаю, может стать ужасным (как ужасное O (3^n), являющееся n числом узлов), поэтому я инкапсулировался в timeOut, но он игнорируется.

Минимальный код, чтобы воспроизвести проблему

library(igraph) 
library(R.utils) 
g<-erdos.renyi.game(1e6,1e7,type="gnm") 
o<-evalWithTimeout(maximal.cliques(g),timeout=1) 

Это должно остановить через одну секунду. Однако это не так. Интересно, связано ли это с использованием базового кода C/Fortran (что и делает maximal.cliques). Если да, то как я могу это решить?

ответ

1

Это не будет работать с большинством C-кода, поскольку R не может прервать C-код, если только код C не работает. evalWithTimeout называет setTimeLimit, и это со страницы вручную из setTimeLimit:

Сроки проверяются каждый раз, когда может произойти прерывание пользователем. Это часто случается в R-коде и во время Sys.sleep, но только в точках в скомпилированном коде C и Fortran, идентифицированном автором кода .

Это не так, чтобы сделать код C прерывистым, потому что вам необходимо освободить выделенную память.

Предлагаем сообщать об ошибке в https://github.com/igraph/igraph/issues и запрашивать, чтобы maximal.cliques прерывается.

+0

Но довольно сложно сделать C-код прерывистым ... вам просто нужно поместить вызовы в R_checkUserInterrupt() 'в стратегических местах. –

+1

Нет, это не тривиально, потому что вам нужно освободить память, и это нетривиально, если функция C, которую вы вызываете, вызывает другие функции C и т. Д. –

 Смежные вопросы

  • Нет связанных вопросов^_^