00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifndef __MMX_HOMOTOPY_FLOATING_HPP
00014 #define __MMX_HOMOTOPY_FLOATING_HPP
00015 #include <continewz/homotopy_euler.hpp>
00016
00017 namespace mmx {
00018 #define Function slp_tangent<C>
00019
00020 template<typename V= homotopy_euler, typename W= homotopy_euler>
00021 struct homotopy_floating {};
00022
00023 template<typename V> struct homotopy_variant_helper<floating<V> > {
00024 typedef homotopy_floating<> HV; };
00025 template<typename V> struct homotopy_variant_helper<complex<floating<V> > > {
00026 typedef homotopy_floating<> HV; };
00027
00028
00029
00030
00031
00032 template<typename C, typename V, typename W>
00033 struct homotopy_stepper_rep<C,homotopy_floating<V,W> >:
00034 public homotopy_stepper_rep<C,homotopy_abstract>
00035 {
00036 public:
00037 typedef Fast_type(C) FC;
00038 typedef homotopy_floating<V,W> S;
00039 typedef homotopy_stepper<FC,V> Fast_stepper;
00040 typedef homotopy_stepper<C ,W> Slow_stepper;
00041 typedef homotopy_stepper<C ,S> Similar_stepper;
00042
00043 public:
00044 nat prec;
00045 nat half_prec;
00046 void* sub_stepper;
00047 Slow_stepper end_stepper;
00048
00049 public:
00050 homotopy_stepper_rep (const Function& f):
00051 homotopy_stepper_rep<C,homotopy_abstract> (f),
00052 prec (mmx_bit_precision),
00053 half_prec (((prec + 64) / 128) * 64),
00054 end_stepper (f)
00055 {
00056 if (prec <= 64) sub_stepper= (void*) new Fast_stepper (fast (f));
00057 else {
00058 nat old_bit_precision= mmx_bit_precision;
00059 mmx_bit_precision= half_prec;
00060 sub_stepper= (void*) new Similar_stepper (copy (f));
00061 mmx_bit_precision= old_bit_precision;
00062 }
00063 }
00064
00065 ~homotopy_stepper_rep () {
00066 if (prec <= 64) delete ((Fast_stepper*) sub_stepper);
00067 else {
00068 nat old_bit_precision= mmx_bit_precision;
00069 mmx_bit_precision= half_prec;
00070 delete ((Similar_stepper*) sub_stepper);
00071 mmx_bit_precision= old_bit_precision;
00072 }
00073 }
00074
00075 vector<C>
00076 hom (const vector<C>& init, nat k, const C& t1) {
00077 return homp (init, k, vec<C> (init[k], t1));
00078 }
00079
00080 vector<C>
00081 homp (const vector<C>& init, nat k, const vector<C>& p) {
00082
00083
00084 nat old_bit_precision= mmx_bit_precision;
00085 mmx_bit_precision= prec;
00086 vector<C> v;
00087 if (prec <= 64) {
00088
00089 Fast_stepper stepper= *((Fast_stepper*) sub_stepper);
00090 v= slow<vector<C> > (homx (stepper, fast (init), k, fast (p)));
00091 }
00092 else {
00093
00094 Similar_stepper stepper= *((Similar_stepper*) sub_stepper);
00095 v= unary_map<copy_op> (homx (stepper, init, k, p));
00096 }
00097 v= homx (end_stepper, v, k, p);
00098 mmx_bit_precision= old_bit_precision;
00099 return v;
00100 }
00101 };
00102
00103 #undef Function
00104 }
00105 #endif // __MMX_HOMOTOPY_FLOATING_HPP