00001 #ifndef EQUATIONH
00002 #define EQUATIONH
00003
00004 #include "boolean.h"
00005 #include "interval.h"
00006 #include "variables.h"
00007 #include "variable_set.h"
00008 #include "monomial.h"
00009 #include "linear_constraint.h"
00010 #include "csmapping.h"
00011
00012 #include <stdlib.h>
00013
00014
00031 #define MAX_TERMS_SIMP 1
00032
00033
00040 #define INIT_NUM_MONOMIALS 100
00041
00042
00043
00051 #define LINEAR_EQUATION 0
00052
00060 #define CIRCLE_EQUATION 1
00061
00069 #define SADDLE_EQUATION 2
00070
00078 #define PARABOLA_EQUATION 3
00079
00087 #define SPHERE_EQUATION 4
00088
00089
00097 #define BILINEAR_EQUATION 5
00098
00106 #define GENERAL_EQUATION 6
00107
00115 #define UNKNOWN_EQ_TYPE 7
00116
00117
00125 #define SYSTEM_EQ 0
00126
00134 #define COORD_EQ 1
00135
00143 #define DUMMY_EQ 2
00144
00153 #define DERIVED_EQ 3
00154
00161 #define NOTYPE_EQ 4
00162
00163
00168 #define GEQ 0
00169
00174 #define LEQ 1
00175
00180 #define EQU 2
00181
00186 #define NOCMP 3
00187
00188
00189
00215 typedef struct {
00216 unsigned int type;
00218 unsigned int cmp;
00219 unsigned int order;
00220 double value;
00222 unsigned int maxMonomials;
00223 unsigned int nMonomials;
00224 Tmonomial **monomials;
00226 Tvariable_set vars;
00227 } Tequation;
00228
00236 void InitEquation(Tequation *eq);
00237
00247 void ResetEquation(Tequation *eq);
00248
00249
00261 void EquationFromLinearConstraint(TLinearConstraint *lc,Tequation *eq);
00262
00274 void EquationFromLinearConstraintProduct(TLinearConstraint *lc1,TLinearConstraint *lc2,Tequation *eq);
00275
00284 void CopyEquation(Tequation *eq_dst,Tequation *eq_orig);
00285
00302 void RewriteEquation(double epsilon,Tmapping *map,Tequation *eqOut,Tequation *eq);
00303
00313 void AccumulateEquations(Tequation *eqn,double ct,Tequation *eq);
00314
00327 unsigned int FixVariableInEquation(double epsilon,unsigned int nv,double b,Tequation *eq);
00328
00343 unsigned int ReplaceVariableInEquation(double epsilon,unsigned int nv,
00344 TLinearConstraint *lc,Tequation *eq);
00345
00357 void CtScaleEquation(double ct,Tequation *eq);
00358
00359
00370 void VarScaleEquation(unsigned int v,Tequation *eq);
00371
00384 void NormalizeEquation(Tequation *eq);
00385
00419 boolean IsSimplificable(unsigned int simpLevel,unsigned int nTerms,boolean *systemVars,
00420 unsigned int *v,TLinearConstraint *lc,
00421 Tequation *eq);
00422
00431 void SetEquationCmp(unsigned int cmp,Tequation *eq);
00432
00441 void SetEquationType(unsigned int type,Tequation *eq);
00442
00443
00452 void SetEquationValue(double v,Tequation *eq);
00453
00463 boolean LinearEquation(Tequation *eq);
00464
00474 boolean BilinearEquation(Tequation *eq);
00475
00485 boolean CircleEquation(Tequation *eq);
00486
00496 boolean SphereEquation(Tequation *eq);
00497
00508 boolean SaddleEquation(Tequation *eq);
00509
00510
00521 boolean ParabolaEquation(Tequation *eq);
00522
00532 unsigned int GetEquationCmp(Tequation *eq);
00533
00543 unsigned int GetEquationType(Tequation *eq);
00544
00554 double GetEquationValue(Tequation *eq);
00555
00565 unsigned int GetEquationOrder(Tequation *eq);
00566
00578 Tvariable_set *GetEquationVariables(Tequation *eq);
00579
00589 unsigned int GetEquationNumVariables(Tequation *eq);
00590
00608 unsigned int CmpEquations(Tequation *eq1,Tequation *eq2);
00609
00622 void AddMonomial(Tmonomial*f,Tequation *eq);
00623
00633 void GenerateParabolaEquation(unsigned int vx,unsigned int vy,Tequation *eq);
00634
00645 void GenerateScaledParabolaEquation(double s,unsigned int vx,unsigned int vy,Tequation *eq);
00646
00659 void GenerateSaddleEquation(unsigned int vx,unsigned int vy,unsigned int vz,
00660 Tequation *eq);
00661
00662
00676 void GenerateScaledSaddleEquation(double s,
00677 unsigned int vx,unsigned int vy,unsigned int vz,
00678 Tequation *eq);
00679
00693 void GenerateGeneralNormEquation(unsigned int nv,unsigned int *v,double n,Tequation *eq);
00706 void GenerateNormEquation(unsigned int vx,unsigned int vy,unsigned int vz,
00707 double n,
00708 Tequation *eq);
00739 void GenerateCrossProductEquations(unsigned int v1x,unsigned int v1y,unsigned int v1z,
00740 unsigned int v2x,unsigned int v2y,unsigned int v2z,
00741 unsigned int v3x,unsigned int v3y,unsigned int v3z,
00742 unsigned int vs,
00743 double s,
00744 Tequation *eq);
00745
00772 void GenerateDotProductEquation(unsigned int v1x,unsigned int v1y,unsigned int v1z,
00773 unsigned int v2x,unsigned int v2y,unsigned int v2z,
00774 unsigned int vc,
00775 double c,
00776 Tequation *eq);
00777
00791 unsigned int FindMonomial(Tmonomial *f,Tequation *eq);
00792
00804 Tmonomial *GetMonomial(unsigned int i,Tequation *eq);
00805
00815 unsigned int GetNumMonomials(Tequation *eq);
00816
00833 void LinearEquation2LinearConstraint(TLinearConstraint *lc,Tequation *eq);
00834
00850 double EvaluateEquation(double *varValues,Tequation *eq);
00851
00864 void EvaluateEquationInt(Tinterval *varValues,Tinterval *i_out,Tequation *eq);
00865
00875 void DeriveEquation(unsigned int nv,Tequation *d,Tequation *eq);
00876
00895 void PrintMonomials(FILE *f,char **varNames,Tequation *eq);
00896
00911 void PrintEquation(FILE *f,char **varNames,Tequation *eq);
00912
00920 void DeleteEquation(Tequation *eq);
00921
00922 #endif