00001 #ifndef POLYNOMIAL_H_JAN_6_2007
00002 #define POLYNOMIAL_H_JAN_6_2007
00003
00004 #include <iostream>
00005 #include <map>
00006 #include <string>
00007
00008
00009 #include <sstream>
00010 #include "array.h"
00011
00012
00013 using namespace std;
00014
00015 typedef map<int, double> VarCont;
00016
00017 struct DoubleRange {
00018 DoubleRange() {
00019 low = 0;
00020 high = 0;
00021 iType = 0;
00022 }
00023 double low;
00024 double high;
00025
00026
00027 int iType;
00028 };
00029
00030 template <typename Type>
00031 bool ArrayCompare(Array<Type> const & a1, Array<Type> const & a2);
00032
00033 class PolyNomial
00034 {
00035 public:
00036 PolyNomial();
00037 PolyNomial(const PolyNomial& pl);
00038 PolyNomial(PolyNomial& pl);
00039 ~PolyNomial();
00040
00041 void Clear();
00042
00043
00044 void Copy(PolyNomial& pl);
00045 void Copy(const PolyNomial& pl);
00046
00047
00048 void operator=(PolyNomial& pl);
00049 void operator=(const PolyNomial& pl);
00050
00051
00052 double ComputePlValue(const Array<double>& vars);
00053 double ComputePlValue();
00054
00055
00056 PolyNomial GetGradient(int varInIdx);
00057
00058 Array<double> GetGradient();
00059
00060
00061 void Normalize();
00062
00063 bool NormalizeGaussian();
00064
00065
00066 void ReadFrom(istream& is);
00067 void PrintVars(ostream& os) const;
00068 void PrintTo(ostream& os) const;
00069 void PrintCoef(ostream& os, double coef) const;
00070
00071
00072 void MultiplyConst(double coef);
00073
00074
00075 void GetGaussianPara(double* miu, double* stdev);
00076 void AddPl(const PolyNomial& pl);
00077
00078
00079 double GetHighestOrder(int varInIdx);
00080
00081
00082 bool AddVar(const string& var) {
00083 if (varsearch_.find(var) != varsearch_.end())
00084 {
00085 return false;
00086 }
00087 varsearch_[var] = numVar_;
00088 numVar_++;
00089 var_.append(var);
00090 varValue_.append(0.0);
00091 return true;
00092 }
00093
00094 bool AddItem(const VarCont& item, double coef) {
00095 VarCont::const_iterator cit = item.begin();
00096 for (; cit != item.end(); ++cit) {
00097 int var_id = cit->first;
00098 if (var_id >= numVar_) return false;
00099 }
00100 numItems_ ++;
00101 coef_.append(coef);
00102 items_.append(item);
00103 strItems_.append(GenerateItemString(item));
00104 Normalize();
00105 return true;
00106 }
00107
00108 void SetVarName(const Array<string>& varName) {
00109 assert(varName.size()== numVar_);
00110 var_.clear();
00111 var_.append(varName);
00112
00113 varsearch_.clear();
00114 for(int i = 0; i < var_.size(); ++i) {
00115 varsearch_[var_[i]] = i;
00116 }
00117 }
00118
00119
00120 void SetVarValue(const Array<double>& varValue) {
00121 assert(varValue.size()== numVar_);
00122 varValue_.clear();
00123 varValue_.append(varValue);
00124 }
00125
00126 void SetConstantValue(double val) {
00127 constValue_ = val;
00128 }
00129 double GetConstantValue() {
00130 return constValue_;
00131 }
00132
00133 void ReduceToOneVar(const Array<double>& vars, int varIdx);
00134 void ReduceToOneVar(int varIdx);
00135
00136
00137 string GenerateItemString(const VarCont& vc);
00138
00139
00140 DoubleRange SolvePoly2(double d);
00141 DoubleRange SolvePoly2(double a, double b, double c, double d);
00142
00143
00144 double QuadraticOptimization();
00145
00146 const Array<double>& GetVarValue() const {return varValue_;}
00147 double GetVarValue(int varIdx) {return varValue_[varIdx];}
00148 void ClearVarValue() {varValue_.clear();}
00149 void AppendVarValue(double value) {varValue_.append(value);}
00150 const int GetVarNum() const {return numVar_;}
00151
00152 const string& GetVarAt(int varIdx) const {return var_[varIdx];}
00153
00154 int GetVarIdx(string& var) const {
00155 map<string, int>::const_iterator citer = varsearch_.find(var);
00156 if (citer != varsearch_.end())
00157 return citer->second;
00158 else return -1;
00159 }
00160
00161 const double& GetCoef(int varIdx) const { return coef_[varIdx];}
00162 const Array<string> & GetVar() const {return var_;}
00163 const map<string, int>& GetVarSearch() const{ return varsearch_;}
00164
00165
00166 double ComputeItem(int itemIdx);
00167 bool IsQuadratic();
00168 int Optimize2(Array<double>* vars, double* optValue);
00169
00170
00171
00172 struct QuadraticPolyPara {
00173 double a;
00174 double b;
00175 double c;
00176 };
00177 Array<double> varValue_;
00178 public:
00179 int numVar_;
00180 int numItems_;
00181 double constValue_;
00182 QuadraticPolyPara gpara_;
00183 Array<string> strItems_;
00184 Array<double> coef_;
00185 Array<VarCont> items_;
00186 Array<string> var_;
00187 map<string, int> varsearch_;
00188 };
00189
00190 #endif