Comments 32
Проблема у вас интересная и хорошая, но в некоторых местах категоричность суждений, уж извините, зашкаливает.
Если отбросить фразы про качество кода под Линукс (которое бывает очень разным), то для тестового запуска можно поднять виртуалку под линукс, написать на любом удобном языке демона, который будет обрабатывать запросы по сети от вашего програмного обеспечения и по сети же отсылает результат. Если время работы функций превышает издержки на удаленный вызов — то как минимум будет возможность проверить гипотезу и узнать стоит ли заниматься портированием.
Boost — отличная библиотека, а использование шаблонов порой единственный вариант чтобы исправить недостатки С++ и получить оптимальную производительность. К тому же она вполне себе компилируется под Visual Studio, если брать свежие версии, то под них есть утилиты, которые автоматически собирают либы под х32 и х64 для студии.
Первая проблема — они написаны под Linux. Хороша новость, то что они написаны на Си. Вообще, смотря код писанный под Linux я никак не могу побороть у себя впечатление, что возвращаюсь в доисторическую эпоху. Говорить о совместимости с Windows (т.е. якобы многоплатформенности) — совершенно не приходится (а я как минимум 3 больших проекта «смотрел»).
Если отбросить фразы про качество кода под Линукс (которое бывает очень разным), то для тестового запуска можно поднять виртуалку под линукс, написать на любом удобном языке демона, который будет обрабатывать запросы по сети от вашего програмного обеспечения и по сети же отсылает результат. Если время работы функций превышает издержки на удаленный вызов — то как минимум будет возможность проверить гипотезу и узнать стоит ли заниматься портированием.
Попробовал я партировать Phaistos в Windows… невозможно. Он использует библиотеку boost, где я после пару дней мучений пришел к однозначному выводу, библиотека сама по себе дрянь (использование шаблонов, в таком количестве, что код получается ужасным), и она не компилируется под Windows на MS Visual Studio
Boost — отличная библиотека, а использование шаблонов порой единственный вариант чтобы исправить недостатки С++ и получить оптимальную производительность. К тому же она вполне себе компилируется под Visual Studio, если брать свежие версии, то под них есть утилиты, которые автоматически собирают либы под х32 и х64 для студии.
Про Boost — я вам скажу в чем проблема. Не компилируется
util.hpp (BOOST_STRING_UTIL_DETAIL_HPP)
с ошибкой компилятора error C2951: Объявления шаблона разрешены только в глобальной области, области пространства имен и области класса
(именно это критично, остальное можно решить)
На данный комментарий, служба поддержки отвечала где-то (натолкнулся) используйте другой компилятор :)
P.S. С остальным не согласен по определению, отсюда и категоричность. Но разговор получится длинным и не по теме. Можно жить и с проблемами 30-летней давности, но как то теперь не хочется… есть много лучшие альтернативы.
util.hpp (BOOST_STRING_UTIL_DETAIL_HPP)
с ошибкой компилятора error C2951: Объявления шаблона разрешены только в глобальной области, области пространства имен и области класса
(именно это критично, остальное можно решить)
На данный комментарий, служба поддержки отвечала где-то (натолкнулся) используйте другой компилятор :)
P.S. С остальным не согласен по определению, отсюда и категоричность. Но разговор получится длинным и не по теме. Можно жить и с проблемами 30-летней давности, но как то теперь не хочется… есть много лучшие альтернативы.
Можно узнать версию boost'а, Visual Studio, и команду компиляции?
Все самое новое, boost 1.51, Visual Studio 2010. Что значит команда компиляции?
Там такой код в util.hpp (BOOST_STRING_UTIL_DETAIL_HPP)
где не компилируется строка return copy_range(Range);
т.к. copy_range тоже шаблон, который определен в теле функции, что и говорит ошибка error C2951
Там такой код в util.hpp (BOOST_STRING_UTIL_DETAIL_HPP)
template<
typename SeqT,
typename IteratorT=BOOST_STRING_TYPENAME SeqT::const_iterator >
struct copy_iterator_rangeF :
public std::unary_function< iterator_range<IteratorT>, SeqT >
{
SeqT operator()( const iterator_range<IteratorT>& Range ) const
{
return copy_range<SeqT>(Range);
}
};
где не компилируется строка return copy_range(Range);
т.к. copy_range тоже шаблон, который определен в теле функции, что и говорит ошибка error C2951
Вы сам boost собираете, или уже проект, который его использует? Если сам буст, то скорее всего вы запускаете ./b2 с какими-то параметрами. Добавьте туда -d+2 и покажите, что он пишет.
Я собираю все вместе проект, который ссылается на неоткомпилированный буст.
Про параметры не понял, это параметры чего?
Вот мои параметры компиляции
/ZI /nologo /W3 /WX- /Od /Oy- /D "_MBCS" /Gm /EHsc /RTC1 /GS /fp:precise /Zc:wchar_t /Zc:forScope /Fp«Debug\RNAInSpaceCRISP.pch» /Fa«Debug\» /Fo«Debug\» /Fd«Debug\vc100.pdb» /Gd /analyze- /errorReport:queue
А вот параметры компоновщика
/OUT:«P:\_PROGRAMMING_\RNAInSpaceCRISP\Debug\RNAInSpaceCRISP.exe» /NOLOGO «kernel32.lib» «user32.lib» «gdi32.lib» «winspool.lib» «comdlg32.lib» «advapi32.lib» «shell32.lib» «ole32.lib» «oleaut32.lib» «uuid.lib» «odbc32.lib» «odbccp32.lib» /MANIFEST /ManifestFile:«Debug\RNAInSpaceCRISP.exe.intermediate.manifest» /ALLOWISOLATION /MANIFESTUAC:«level='asInvoker' uiAccess='false'» /DEBUG /PDB:«P:\_PROGRAMMING_\RNAInSpaceCRISP\Debug\RNAInSpaceCRISP.pdb» /PGD:«P:\_PROGRAMMING_\RNAInSpaceCRISP\Debug\RNAInSpaceCRISP.pgd» /TLBID:1 /DYNAMICBASE /NXCOMPAT /MACHINE:X86 /ERRORREPORT:QUEUE
Про параметры не понял, это параметры чего?
Вот мои параметры компиляции
/ZI /nologo /W3 /WX- /Od /Oy- /D "_MBCS" /Gm /EHsc /RTC1 /GS /fp:precise /Zc:wchar_t /Zc:forScope /Fp«Debug\RNAInSpaceCRISP.pch» /Fa«Debug\» /Fo«Debug\» /Fd«Debug\vc100.pdb» /Gd /analyze- /errorReport:queue
А вот параметры компоновщика
/OUT:«P:\_PROGRAMMING_\RNAInSpaceCRISP\Debug\RNAInSpaceCRISP.exe» /NOLOGO «kernel32.lib» «user32.lib» «gdi32.lib» «winspool.lib» «comdlg32.lib» «advapi32.lib» «shell32.lib» «ole32.lib» «oleaut32.lib» «uuid.lib» «odbc32.lib» «odbccp32.lib» /MANIFEST /ManifestFile:«Debug\RNAInSpaceCRISP.exe.intermediate.manifest» /ALLOWISOLATION /MANIFESTUAC:«level='asInvoker' uiAccess='false'» /DEBUG /PDB:«P:\_PROGRAMMING_\RNAInSpaceCRISP\Debug\RNAInSpaceCRISP.pdb» /PGD:«P:\_PROGRAMMING_\RNAInSpaceCRISP\Debug\RNAInSpaceCRISP.pgd» /TLBID:1 /DYNAMICBASE /NXCOMPAT /MACHINE:X86 /ERRORREPORT:QUEUE
Это из настроек проекта Visual Studio? Если да, то зайдите во вкладку output, log или как там она называется, и скопируйте текст оттуда.
Перед этим сделайте, как описано в ответе здесь: stackoverflow.com/questions/1211841/how-can-i-make-visual-studios-build-be-very-verbose
Да, это из настроек проекта Visual Studio. Но не пойму про какую вкладу говорите. Самое похожие C/C++ -> Output Files… но вроде это не то…
Надо установить какие-то параметры компилятора, компоновщика? Какие?
Надо установить какие-то параметры компилятора, компоновщика? Какие?
Там же где errors.
В бусте чтобы понять, что именно падает, мало маленького кусочка кода посреди header файла. Я хочу увидеть, на компиляции какого именно файла (.cpp) у вас что-то падает, и какие пути для поиска header-файлов передаются компилятору, чтобы можно было воспроизвести.
В бусте чтобы понять, что именно падает, мало маленького кусочка кода посреди header файла. Я хочу увидеть, на компиляции какого именно файла (.cpp) у вас что-то падает, и какие пути для поиска header-файлов передаются компилятору, чтобы можно было воспроизвести.
Окно, нашел (оно по умолчанию скрыто)… но там хренова туча… там еще много warning которые не относятся к делу.
вот что-то от туда про эту ошибку
1>p:\ps\microsoft visual studio 10.0\vc\include\boost\algorithm\string\detail\util.hpp(97): error C2951: Объявления шаблон разрешены только в глобальной области, области пространства имен и области класса
1> p:\ps\microsoft visual studio 10.0\vc\include\boost\algorithm\string\detail\util.hpp(96): при компиляции функции-члена «std::basic_string<_Elem,_Traits,_Ax> boost::algorithm::detail::copy_iterator_rangeF<SeqT,IteratorT>::operator ()(const boost::iterator_range &) const» класса шаблон
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits,
1> _Ax=std::allocator,
1> SeqT=std::basic_string<char,std::char_traits,std::allocator>,
1> IteratorT=input_iterator_type
1> ]
1> p:\ps\microsoft visual studio 10.0\vc\include\boost\utility\result_of.hpp(41): см. ссылку на создание экземпляров класса шаблон при компиляции «boost::algorithm::detail::copy_iterator_rangeF<SeqT,IteratorT>»
1> with
1> [
1> SeqT=std::basic_string<char,std::char_traits,std::allocator>,
1> IteratorT=input_iterator_type
1> ]
1> p:\ps\microsoft visual studio 10.0\vc\include\boost\utility\detail\result_of_iterate.hpp(28): см. ссылку на создание экземпляров класса шаблон при компиляции «boost::detail::has_result_type»
1> with
1> [
1> T=const copy_range_type
1> ]
1> p:\ps\microsoft visual studio 10.0\vc\include\boost\utility\detail\result_of_iterate.hpp(75): см. ссылку на создание экземпляров класса шаблон при компиляции «boost::tr1_result_of»
1> with
1> [
1> F=const copy_range_type (const boost::iterator_range<std::_String_iterator<char,std::char_traits,std::allocator>> &)
1> ]
1> p:\ps\microsoft visual studio 10.0\vc\include\boost\mpl\eval_if.hpp(41): см. ссылку на создание экземпляров класса шаблон при компиляции «boost::result_of»
1> with
1> [
1> F=const copy_range_type (const boost::iterator_range<std::_String_iterator<char,std::char_traits,std::allocator>> &)
1> ]
1> p:\ps\microsoft visual studio 10.0\vc\include\boost\iterator\iterator_adaptor.hpp(166): см. ссылку на создание экземпляров класса шаблон при компиляции «boost::mpl::eval_if<C,F1,F2>»
1> with
1> [
1> C=boost::is_same<boost::use_default,boost::use_default>,
1> F1=boost::result_of<const copy_range_type (const boost::iterator_range<std::_String_iterator<char,std::char_traits,std::allocator>> &)>,
1> F2=boost::mpl::identity<boost::use_default>
1> ]
1> p:\ps\microsoft visual studio 10.0\vc\include\boost\iterator\transform_iterator.hpp(50): см. ссылку на создание экземпляров класса шаблон при компиляции «boost::detail::ia_dflt_help<T,DefaultNullaryFn>»
1> with
1> [
1> T=boost::use_default,
1> DefaultNullaryFn=boost::result_of<const copy_range_type (const boost::iterator_range<std::_String_iterator<char,std::char_traits,std::allocator>> &)>
1> ]
1> p:\ps\microsoft visual studio 10.0\vc\include\boost\iterator\transform_iterator.hpp(75): см. ссылку на создание экземпляров класса шаблон при компиляции «boost::detail::transform_iterator_base<UnaryFunc,Iterator,Reference,Value>»
1> with
1> [
1> UnaryFunc=copy_range_type,
1> Iterator=find_iterator_type,
1> Reference=boost::use_default,
1> Value=boost::use_default
1> ]
1> p:\ps\microsoft visual studio 10.0\vc\include\boost\algorithm\string\iter_find.hpp(168): см. ссылку на создание экземпляров класса шаблон при компиляции «boost::transform_iterator<UnaryFunc,Iterator>»
1> with
1> [
1> UnaryFunc=copy_range_type,
1> Iterator=find_iterator_type
1> ]
1> p:\ps\microsoft visual studio 10.0\vc\include\boost\algorithm\string\split.hpp(149): см. ссылку на создание экземпляров функции шаблон при компиляции «SequenceSequenceT &boost::algorithm::iter_split<SequenceSequenceT,RangeT,boost::algorithm::detail::token_finderF>(SequenceSequenceT &,RangeT &,FinderT)»
1> with
1> [
1> SequenceSequenceT=std::vector<std::string>,
1> RangeT=std::string,
1> PredicateT=boost::algorithm::detail::is_any_ofF,
1> FinderT=boost::algorithm::detail::token_finderF<boost::algorithm::detail::is_any_ofF>
1> ]
1> p:\_programming_\rnainspacecrisp\rnainspacecrisp\definitions.h(590): см. ссылку на создание экземпляров функции шаблон при компиляции «SequenceSequenceT &boost::algorithm::split<std::vector<_Ty>,std::string,boost::algorithm::detail::is_any_ofF>(SequenceSequenceT &,RangeT &,PredicateT,boost::algorithm::token_compress_mode_type)»
1> with
1> [
1> SequenceSequenceT=std::vector<std::string>,
1> _Ty=std::string,
1> CharT=char,
1> RangeT=std::string,
1> PredicateT=boost::algorithm::detail::is_any_ofF1> ]
и не одного .cpp
вот что-то от туда про эту ошибку
1>p:\ps\microsoft visual studio 10.0\vc\include\boost\algorithm\string\detail\util.hpp(97): error C2951: Объявления шаблон разрешены только в глобальной области, области пространства имен и области класса
1> p:\ps\microsoft visual studio 10.0\vc\include\boost\algorithm\string\detail\util.hpp(96): при компиляции функции-члена «std::basic_string<_Elem,_Traits,_Ax> boost::algorithm::detail::copy_iterator_rangeF<SeqT,IteratorT>::operator ()(const boost::iterator_range &) const» класса шаблон
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits,
1> _Ax=std::allocator,
1> SeqT=std::basic_string<char,std::char_traits,std::allocator>,
1> IteratorT=input_iterator_type
1> ]
1> p:\ps\microsoft visual studio 10.0\vc\include\boost\utility\result_of.hpp(41): см. ссылку на создание экземпляров класса шаблон при компиляции «boost::algorithm::detail::copy_iterator_rangeF<SeqT,IteratorT>»
1> with
1> [
1> SeqT=std::basic_string<char,std::char_traits,std::allocator>,
1> IteratorT=input_iterator_type
1> ]
1> p:\ps\microsoft visual studio 10.0\vc\include\boost\utility\detail\result_of_iterate.hpp(28): см. ссылку на создание экземпляров класса шаблон при компиляции «boost::detail::has_result_type»
1> with
1> [
1> T=const copy_range_type
1> ]
1> p:\ps\microsoft visual studio 10.0\vc\include\boost\utility\detail\result_of_iterate.hpp(75): см. ссылку на создание экземпляров класса шаблон при компиляции «boost::tr1_result_of»
1> with
1> [
1> F=const copy_range_type (const boost::iterator_range<std::_String_iterator<char,std::char_traits,std::allocator>> &)
1> ]
1> p:\ps\microsoft visual studio 10.0\vc\include\boost\mpl\eval_if.hpp(41): см. ссылку на создание экземпляров класса шаблон при компиляции «boost::result_of»
1> with
1> [
1> F=const copy_range_type (const boost::iterator_range<std::_String_iterator<char,std::char_traits,std::allocator>> &)
1> ]
1> p:\ps\microsoft visual studio 10.0\vc\include\boost\iterator\iterator_adaptor.hpp(166): см. ссылку на создание экземпляров класса шаблон при компиляции «boost::mpl::eval_if<C,F1,F2>»
1> with
1> [
1> C=boost::is_same<boost::use_default,boost::use_default>,
1> F1=boost::result_of<const copy_range_type (const boost::iterator_range<std::_String_iterator<char,std::char_traits,std::allocator>> &)>,
1> F2=boost::mpl::identity<boost::use_default>
1> ]
1> p:\ps\microsoft visual studio 10.0\vc\include\boost\iterator\transform_iterator.hpp(50): см. ссылку на создание экземпляров класса шаблон при компиляции «boost::detail::ia_dflt_help<T,DefaultNullaryFn>»
1> with
1> [
1> T=boost::use_default,
1> DefaultNullaryFn=boost::result_of<const copy_range_type (const boost::iterator_range<std::_String_iterator<char,std::char_traits,std::allocator>> &)>
1> ]
1> p:\ps\microsoft visual studio 10.0\vc\include\boost\iterator\transform_iterator.hpp(75): см. ссылку на создание экземпляров класса шаблон при компиляции «boost::detail::transform_iterator_base<UnaryFunc,Iterator,Reference,Value>»
1> with
1> [
1> UnaryFunc=copy_range_type,
1> Iterator=find_iterator_type,
1> Reference=boost::use_default,
1> Value=boost::use_default
1> ]
1> p:\ps\microsoft visual studio 10.0\vc\include\boost\algorithm\string\iter_find.hpp(168): см. ссылку на создание экземпляров класса шаблон при компиляции «boost::transform_iterator<UnaryFunc,Iterator>»
1> with
1> [
1> UnaryFunc=copy_range_type,
1> Iterator=find_iterator_type
1> ]
1> p:\ps\microsoft visual studio 10.0\vc\include\boost\algorithm\string\split.hpp(149): см. ссылку на создание экземпляров функции шаблон при компиляции «SequenceSequenceT &boost::algorithm::iter_split<SequenceSequenceT,RangeT,boost::algorithm::detail::token_finderF>(SequenceSequenceT &,RangeT &,FinderT)»
1> with
1> [
1> SequenceSequenceT=std::vector<std::string>,
1> RangeT=std::string,
1> PredicateT=boost::algorithm::detail::is_any_ofF,
1> FinderT=boost::algorithm::detail::token_finderF<boost::algorithm::detail::is_any_ofF>
1> ]
1> p:\_programming_\rnainspacecrisp\rnainspacecrisp\definitions.h(590): см. ссылку на создание экземпляров функции шаблон при компиляции «SequenceSequenceT &boost::algorithm::split<std::vector<_Ty>,std::string,boost::algorithm::detail::is_any_ofF>(SequenceSequenceT &,RangeT &,PredicateT,boost::algorithm::token_compress_mode_type)»
1> with
1> [
1> SequenceSequenceT=std::vector<std::string>,
1> _Ty=std::string,
1> CharT=char,
1> RangeT=std::string,
1> PredicateT=boost::algorithm::detail::is_any_ofF1> ]
и не одного .cpp
понял что вы хотите вот какой «пользовательский» код приводит к ошибке
Использование boost::is_any_of
inline std::istream &operator>>(std::istream &input, AtomSelectionEnum &a) {
std::string raw_string;
std::getline(input, raw_string);
std::vector<std::string> split_raw_string;
boost::split(split_raw_string,
raw_string,
boost::is_any_of(" "));
AtomSelectionEnum atom_selection = NO_ATOMS;
for (unsigned int i=0; i<split_raw_string.size(); ++i) {
for (unsigned int j=0; j<ATOM_SELECTION_ENUM_SIZE; ++j) {
if (split_raw_string[i] == atom_selection_name[j]) {
atom_selection = AtomSelectionEnum((int)atom_selection |
(int)atom_selection_array[j]);
break;
}
}
}
if (atom_selection != NO_ATOMS)
a = atom_selection;
return input;
}
Использование boost::is_any_of
View->Output
b2 — это что?
Он же bjam, в boost'е не все библиотеки header-only, что-то нужно предварительно компилить. Примерно как описано здесь: www.boost.org/doc/libs/1_51_0/doc/html/bbv2/installation.html или dev.mindillusion.ru/boost/
Вроде как ясно, bjam видимо откомпилирует boost другим не MS компилятором и все будет тогда будет ок. Геморрой, конечно… но решение.
Нет, он его компилирует тем, который есть. В вашем случае это будет cl.exe.
тогда странно, почему же выше я делаю по сути тоже, но там очевидная ошибка с точки зрения MS компилятора?
Ну, ок, я запустил компиляцию lib но ошибка выше думаю не связана с библиотеками. Там где были нужны библиотеки у меня запросил линковщик, и я их отдельно компилировал и давал ему. А тут другой случай.
и да, такого типа ошибок (именно определения шаблонов не там где положено) много, эта характерный пример.
Вот с чем мы имеем дело в boost Объективные недостатки С++, снова хреново функциональное программирование, оказывается используется boost::mpl… ну и конечно жди ошибок…
справедливости ради надо сказать, что именно хитровывернутый код от Phaistos так закручивает использование boost, что получаются ошибки… но сама библиотека это не ловит, а лог ошибок с большим трудом дает понять в чем дело… все это превращает программирование в геморрой и ничего более… настоятельно советую не использовать boost, не будите способствовать появлению багов…
Так какую статью вы не смогли понять?
Поможете?
Вообще статья называлась A CONCERTED-ROTATION ALGORITHM FOR MONTE CARLO SAMPLING OF PROTEINS, но похоже её убрали из публичного доступа… если захотите прочесть и рассказать пишите в личку, попробую найти вроде бы сохранял у себя, вышлю почтой
И да, правильнее сказать я не понимаю алгоритм описанный в статье
А вообще более актуально другая статья, про CRA
Monte Carlo backbone sampling for polypeptides with variable bond angles
and dihedral angles using concerted rotations and a Gaussian bias
Jakob P. Ulmschneider and William L. Jorgensen
Citation: J. Chem. Phys. 118, 4261 (2003); doi: 10.1063/1.1542611
View online: dx.doi.org/10.1063/1.1542611
View Table of Contents: jcp.aip.org/resource/1/JCPSA6/v118/i9
Published by the American Institute of Physics.
Monte Carlo backbone sampling for polypeptides with variable bond angles
and dihedral angles using concerted rotations and a Gaussian bias
Jakob P. Ulmschneider and William L. Jorgensen
Citation: J. Chem. Phys. 118, 4261 (2003); doi: 10.1063/1.1542611
View online: dx.doi.org/10.1063/1.1542611
View Table of Contents: jcp.aip.org/resource/1/JCPSA6/v118/i9
Published by the American Institute of Physics.
Скачал, попробую понять.
Спасибо. Как успехи? Я вроде как грубо запустил одну реализацию этого алгоритма.
Если будите разбираться, давайте посмотрим на сколько реализация соответствует описанному. Как я понимаю на вход нужно подать координаты 15 атомов. Именно 15 — вопрос почему?
Далее первая фаза «prerotation» похоже не может быть произвольным движением, а как-то особо вычисляется. Что будет если мы сделаем произвольный разрыв — вторая фаза «закрытия цепи» не сможет закрыть разрыв?
Вообще понятно ли когда разрыв не будет закрыт этим алгоритмом?
Если будите разбираться, давайте посмотрим на сколько реализация соответствует описанному. Как я понимаю на вход нужно подать координаты 15 атомов. Именно 15 — вопрос почему?
Далее первая фаза «prerotation» похоже не может быть произвольным движением, а как-то особо вычисляется. Что будет если мы сделаем произвольный разрыв — вторая фаза «закрытия цепи» не сможет закрыть разрыв?
Вообще понятно ли когда разрыв не будет закрыт этим алгоритмом?
Эту статью прочитал, теперь читаю статью про CRISP, которую мне прислал автор. Но пока я лишь изучил все поверхностно — с конкретным алгоритмом вычислений я пока не разбирался.
Prerotation выбирается c помощью некоторого гауссового распределения. Его делают небольшим, чтобы атом не ушел слишком далеко. Если атом, к примеру, уйдет дальше чем на длину 3 связей, то закрыть цепь с помощью выбора углов для последних 3 связей будет не возможно. Поэтому нужно искать компромисс. Большое возмущение — быстрее исследуется пространство состояний, но меньшее количество попыток являются удачными (в которых можно закрыть цепь).
Гауссово распределение углов в prerotation выбирается так, чтобы положение последнего атома в prerotation было сферическим гауссовым. Поскольку степеней свободы углов в prerotation достаточно для удержания последнего атома в prerotation неподвижным, то этого не достаточно — изменения углов не получатся малыми. Чтобы этого не происходило, распределение дополнительно домножается на сферическое гауссово распределение для углов. Таким образом получается гауссово распределение величины sqrt((сумма квадратов изменений углов в prerotation)*c_1+(расстояние от исходного положения последнего атома до нового положения последнего атома)^2*c_2).
Prerotation выбирается c помощью некоторого гауссового распределения. Его делают небольшим, чтобы атом не ушел слишком далеко. Если атом, к примеру, уйдет дальше чем на длину 3 связей, то закрыть цепь с помощью выбора углов для последних 3 связей будет не возможно. Поэтому нужно искать компромисс. Большое возмущение — быстрее исследуется пространство состояний, но меньшее количество попыток являются удачными (в которых можно закрыть цепь).
Гауссово распределение углов в prerotation выбирается так, чтобы положение последнего атома в prerotation было сферическим гауссовым. Поскольку степеней свободы углов в prerotation достаточно для удержания последнего атома в prerotation неподвижным, то этого не достаточно — изменения углов не получатся малыми. Чтобы этого не происходило, распределение дополнительно домножается на сферическое гауссово распределение для углов. Таким образом получается гауссово распределение величины sqrt((сумма квадратов изменений углов в prerotation)*c_1+(расстояние от исходного положения последнего атома до нового положения последнего атома)^2*c_2).
можете мне переслать статью про CRISP? (мой майл tac@inbox.lv)
По поводу prerotation, что произойдет, если все несколько упростить. Например, не делать сравнительно сложных вычислений, а сделать произвольный поворот, но гарантировать, что атом далеко не уйдет. Сможет ли вторая фаза закрытия принципиально работать без первой. Я клоню к тому, что мне желательно изменять положение атома (в малом диапазоне, торсионный угол у меня меняется на 0.2 градуса, не скажу сколько это в перемещении атома, но думаю вполне удовлетворяет длине 3 связей) без этой сложной науки… а из алгоритма использовать только вторую фазу закрытия. Я конечно, это могу попробовать экспериментально (что и собираюсь со временем), но хотелось бы знать «приговор» математической теории.
Но это скорее вопросы, когда доберетесь до деталей алгоритма.
Но это скорее вопросы, когда доберетесь до деталей алгоритма.
Sign up to leave a comment.
Развитие RNAInSpace, алгоритм CRA, проблемы кода на Linux и прочие