FLOPC++
|
00001 // ******************** FlopCpp ********************************************** 00002 // File: MP_data.cpp 00003 // $Id$ 00004 // Author: Tim Helge Hultberg (thh@mat.ua.pt) 00005 // Copyright (C) 2003 Tim Helge Hultberg 00006 // All Rights Reserved. 00007 //**************************************************************************** 00008 00009 #include <iostream> 00010 using std::cout; 00011 using std::endl; 00012 00013 #include "MP_data.hpp" 00014 #include "MP_domain.hpp" 00015 #include "MP_index.hpp" 00016 #include "MP_set.hpp" 00017 #include "MP_constant.hpp" 00018 #include "MP_expression.hpp" 00019 00020 using namespace flopc; 00021 double MP_data::outOfBoundData = 0; 00022 00023 const DataRef& DataRef::operator=(const Constant& c) { 00024 C = c; 00025 ((D->S1(I1)*D->S2(I2)*D->S3(I3)*D->S4(I4)*D->S5(I5)).such_that(B)).forall(this); 00026 return *this;; 00027 } 00028 00029 const DataRef& DataRef::operator=(const DataRef& r) { 00030 return operator=(Constant(const_cast<DataRef*>(&r))); 00031 } 00032 00033 void DataRef::operator()() const { 00034 evaluate_lhs(C->evaluate()); 00035 } 00036 00037 DataRef& DataRef::such_that(const MP_boolean& b) { 00038 B = b; 00039 return *this; 00040 } 00041 00042 00043 double DataRef::evaluate() const { 00044 int i1 = D->S1.check(I1->evaluate()); 00045 int i2 = D->S2.check(I2->evaluate()); 00046 int i3 = D->S3.check(I3->evaluate()); 00047 int i4 = D->S4.check(I4->evaluate()); 00048 int i5 = D->S5.check(I5->evaluate()); 00049 00050 int i = D->f(i1,i2,i3,i4,i5); 00051 if ( i == outOfBound ) { 00052 return 0; 00053 } else { 00054 return D->v[i]; 00055 } 00056 } 00057 00058 00059 00060 int DataRef::getStage() const { 00061 int i1 = D->S1.checkStage(I1->evaluate()); 00062 int i2 = D->S2.checkStage(I2->evaluate()); 00063 int i3 = D->S3.checkStage(I3->evaluate()); 00064 int i4 = D->S4.checkStage(I4->evaluate()); 00065 int i5 = D->S5.checkStage(I5->evaluate()); 00066 00067 int stage = 0; 00068 if (i1>stage) stage = i1; 00069 if (i2>stage) stage = i2; 00070 if (i3>stage) stage = i3; 00071 if (i4>stage) stage = i4; 00072 if (i5>stage) stage = i5; 00073 00074 // might need to add outofbound check here 00075 return stage+stochastic; 00076 } 00077 00078 00079 void DataRef::evaluate_lhs(double v) const { 00080 int i1 = D->S1.check(I1->evaluate()); 00081 int i2 = D->S2.check(I2->evaluate()); 00082 int i3 = D->S3.check(I3->evaluate()); 00083 int i4 = D->S4.check(I4->evaluate()); 00084 int i5 = D->S5.check(I5->evaluate()); 00085 00086 int i = D->f(i1,i2,i3,i4,i5); 00087 if (i != outOfBound) { 00088 D->v[i] = v; 00089 } 00090 } 00091 00092 void MP_data::operator()() const { 00093 if (&S1!=&MP_set::getEmpty()) cout << i1.evaluate() << " "; 00094 if (&S2!=&MP_set::getEmpty()) cout << i2.evaluate() << " "; 00095 if (&S3!=&MP_set::getEmpty()) cout << i3.evaluate() << " "; 00096 if (&S4!=&MP_set::getEmpty()) cout << i4.evaluate() << " "; 00097 if (&S5!=&MP_set::getEmpty()) cout << i5.evaluate() << " "; 00098 cout<<" "<<v[f(i1.evaluate(),i2.evaluate(),i3.evaluate(), 00099 i4.evaluate(),i5.evaluate())] << endl; 00100 } 00101 00102 void MP_data::display(string s) { 00103 cout<<s<<endl; 00104 ((S1)(i1)*(S2)(i2)*(S3)(i3)*(S4)(i4)*(S5)(i5)).forall(this); 00105 }