00001 #include <iostream>
00002 #include <algorithm>
00003 #include <fstream>
00004 #include "miscfunc.h"
00005 #include "IterDecon.h"
00006 #include "convert.h"
00007 #include <boost/numeric/ublas/vector.hpp>
00008
00009
00010 namespace ublas=boost::numeric::ublas;
00011 int main()
00012 {
00013 int length = 500;
00014 double dt = 0;
00015 double b = 0;
00016
00017 std::ifstream radial("smp.r"), vertical("smp.z");
00018 std::ofstream predictfile,diffile,filterfile("filter");
00019 radial >> length >> dt >> b;
00020
00021 vertical >> length >> dt >> b;
00022
00023 gplib::rvec TimeSeries1(2*length);
00024 gplib::rvec TimeSeries2(2*length);
00025 gplib::rvec Output(2*length);
00026 for (int i = length/2; i < 1.5*length; ++i)
00027 {
00028 radial >> TimeSeries2(i);
00029 vertical >> TimeSeries1(i);
00030 }
00031 for (int i= 0; i < length/2; ++i)
00032 {
00033 TimeSeries1(i) = TimeSeries1(int(floor(i+1.5*length))) = 0;
00034 TimeSeries2(i) = TimeSeries2(int(floor(i+1.5*length))) = 0;
00035 }
00036
00037
00038
00039
00040
00041
00042 gplib::rvec Filter(TimeSeries1.size());
00043 double variance = 2;
00044 int shift = 0;
00045 double normfactor = 1./(variance * sqrt(2.* acos(-1.)));
00046 for (unsigned int i = 0; i <= Filter.size()/2; ++i)
00047 {
00048 Filter(i) = normfactor * exp( -pow((i-shift),2)/(2. * variance * variance));
00049 Filter(Filter.size() -i-1) = normfactor * exp( -pow((-i-1-shift),2)/(2. * variance * variance));
00050 }
00051 std::copy(Filter.begin(),Filter.end(),std::ostream_iterator<double>(filterfile,"\n"));
00052 Convolve(TimeSeries1,Filter,TimeSeries1);
00053 Convolve(TimeSeries2,Filter,TimeSeries2);
00054 std::ofstream ts1filt("smpf.z"),ts2filt("smpf.r");
00055 std::copy(TimeSeries1.begin(),TimeSeries1.end(),std::ostream_iterator<double>(ts1filt,"\n"));
00056 std::copy(TimeSeries2.begin(),TimeSeries2.end(),std::ostream_iterator<double>(ts2filt,"\n"));
00057 gplib::rvec Current(TimeSeries2);
00058 IterDecon Decon(TimeSeries1.size());
00059 const double power = ublas::prec_inner_prod(TimeSeries2,TimeSeries2);
00060 double error = power;
00061 double previouserror = 1.;
00062 std::string iter;
00063 std::string name;
00064 for (int i = 0; i < 10; ++i)
00065 {
00066 std::cout << std::endl << "Iteration: " << i << std::endl;
00067 iter = stringify(i);
00068 Decon.AdaptFilter(TimeSeries1,Current);
00069 Decon.CalcOutput(TimeSeries1,Output);
00070
00071 gplib::rvec Corr(TimeSeries2);
00072 Correl(TimeSeries1,Current,Corr);
00073 name = "corr"+iter;
00074 predictfile.open(name.c_str());
00075 std::copy(Corr.begin(),Corr.end(),std::ostream_iterator<double>(predictfile,"\n"));
00076 predictfile.close();
00077
00078 Current = TimeSeries2-Output;
00079 error = ublas::prec_inner_prod(Current,Current) /power;
00080 std::cout << "Error: " << error *100 << " Improv: " << (previouserror - error)*100 << std::endl;
00081 name = "pred"+iter;
00082 predictfile.open(name.c_str());
00083 name = "diff"+iter;
00084 diffile.open(name.c_str());
00085 std::copy(Current.begin(),Current.end(),std::ostream_iterator<double>(diffile,"\n"));
00086 std::copy(Output.begin(),Output.end(),std::ostream_iterator<double>(predictfile,"\n"));
00087 diffile.close();
00088 predictfile.close();
00089 previouserror = error;
00090 std::ofstream outfile(("out"+iter).c_str());
00091 Decon.PrintWeights(outfile);
00092 }
00093 }