00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef IMPCORE_CONJUGATE_GRADIENTS_H
00010 #define IMPCORE_CONJUGATE_GRADIENTS_H
00011
00012 #include "core_config.h"
00013
00014 #include <IMP/Optimizer.h>
00015
00016 IMPCORE_BEGIN_NAMESPACE
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 class IMPCOREEXPORT ConjugateGradients : public Optimizer
00032 {
00033 public:
00034 ConjugateGradients(Model *m=NULL);
00035
00036 IMP_OPTIMIZER(ConjugateGradients);
00037
00038
00039 void set_threshold(Float t){ threshold_=t;}
00040
00041
00042 void set_max_change(Float t) { max_change_ = t; }
00043 private:
00044
00045 typedef double NT;
00046
00047
00048 void failure();
00049
00050 NT get_score(std::vector<FloatIndex> float_indices,
00051 std::vector<NT> &x, std::vector<NT> &dscore);
00052 bool line_search(std::vector<NT> &x, std::vector<NT> &dx,
00053 NT &alpha, const std::vector<FloatIndex> &float_indices,
00054 int &ifun, NT &f, NT &dg, NT &dg1,
00055 int max_steps, const std::vector<NT> &search,
00056 const std::vector<NT> &estimate);
00057 Float threshold_;
00058 Float max_change_;
00059 };
00060
00061 IMPCORE_END_NAMESPACE
00062
00063 #endif