//+++++++++++++++++++++++++++++++++++++++++++++++++++++ // File automatically generated by Xfuzzy - DO NOT EDIT //+++++++++++++++++++++++++++++++++++++++++++++++++++++ package pkg.xfl.family; import xfuzzy.lang.*; public class spline extends Family { public spline() { super("xfl","spline"); Parameter single[] = new Parameter[0]; setSingleParameters(single); setParamListName("p"); setParamList(new Parameter[0]); } public int members() { double[] p = getParamListValues(); return p.length+3; } public double compute(int i, double x) { double min = this.min(); double max = this.max(); double[] p = getParamListValues(); double g1 = (p.length>0? p[0] : max) - min; double g2 = max - (p.length>0? p[p.length-1] : min); double a = (i<=2? min+(i-2)*g1 : p[i-3]); double b = (i<=1? min+(i-1)*g1 : (i==p.length+2? max : p[i-2])); double c = (i==0? min : (i>=p.length+1? max+(i-p.length-1)*g2 : p[i-1])); double d = (i>=p.length? max+(i-p.length)*g2 : p[i]); if(x<a || x>d) return 0; if(x<=b) return (x-a)*(x-a)/((b-a)*(c-a)); if(x>=c) return (x-d)*(x-d)/((d-c)*(d-b)); return 1 - (x-b)*(x-b)/((c-b)*(d-b)) - (x-c)*(x-c)/((c-b)*(c-a)); } public double greatereq(int i, double x) { double min = this.min(); double max = this.max(); double[] p = getParamListValues(); double g1 = (p.length>0? p[0] : max) - min; double g2 = max - (p.length>0? p[p.length-1] : min); double a = (i<=2? min+(i-2)*g1 : p[i-3]); double b = (i<=1? min+(i-1)*g1 : (i==p.length+2? max : p[i-2])); double c = (i==0? min : (i>=p.length+1? max+(i-p.length-1)*g2 : p[i-1])); double d = (i>=p.length? max+(i-p.length)*g2 : p[i]); double xmax = (c*d - b*a)/(c+d-b-a); if(x<a) return 0; if(x<=b) return (x-a)*(x-a)/((b-a)*(c-a)); if(x<=xmax) return 1- (x-b)*(x-b)/((c-b)*(d-b)) - (x-c)*(x-c)/((c-b)*(c-a)); return (d-a)/(c+d-a-b); } public double smallereq(int i, double x) { double min = this.min(); double max = this.max(); double[] p = getParamListValues(); double g1 = (p.length>0? p[0] : max) - min; double g2 = max - (p.length>0? p[p.length-1] : min); double a = (i<=2? min+(i-2)*g1 : p[i-3]); double b = (i<=1? min+(i-1)*g1 : (i==p.length+2? max : p[i-2])); double c = (i==0? min : (i>=p.length+1? max+(i-p.length-1)*g2 : p[i-1])); double d = (i>=p.length? max+(i-p.length)*g2 : p[i]); double xmax = (c*d - b*a)/(c+d-b-a); if(x<xmax) return (d-a)/(c+d-a-b); if(x<=c) return 1- (x-b)*(x-b)/((c-b)*(d-b)) - (x-c)*(x-c)/((c-b)*(c-a)); if(x<=d) return (x-d)*(x-d)/((d-c)*(d-b)); return 0; } public double center(int i) { double min = this.min(); double max = this.max(); double[] p = getParamListValues(); double g1 = (p.length>0? p[0] : max) - min; double g2 = max - (p.length>0? p[p.length-1] : min); double a = (i<=2? min+(i-2)*g1 : p[i-3]); double b = (i<=1? min+(i-1)*g1 : (i==p.length+2? max : p[i-2])); double c = (i==0? min : (i>=p.length+1? max+(i-p.length-1)*g2 : p[i-1])); double d = (i>=p.length? max+(i-p.length)*g2 : p[i]); return (c*d - b*a)/(c+d-b-a); } public double basis(int i) { double min = this.min(); double max = this.max(); double[] p = getParamListValues(); double g1 = (p.length>0? p[0] : max) - min; double g2 = max - (p.length>0? p[p.length-1] : min); double a = (i<=2? min+(i-2)*g1 : p[i-3]); double d = (i>=p.length? max+(i-p.length)*g2 : p[i]); return (d-a); } public double[] deriv_eq(int i, double x) { double[] deriv = new double[getNumberOfParameters()]; double min = this.min(); double max = this.max(); double[] p = getParamListValues(); double g1 = (p.length>0? p[0] : max) - min; double g2 = max - (p.length>0? p[p.length-1] : min); double a = (i<=2? min+(i-2)*g1 : p[i-3]); double b = (i<=1? min+(i-1)*g1 : (i==p.length+2? max : p[i-2])); double c = (i==0? min : (i>=p.length+1? max+(i-p.length-1)*g2 : p[i-1])); double d = (i>=p.length? max+(i-p.length)*g2 : p[i]); double da = 0; double db = 0; double dc = 0; double dd = 0; if(a<x && x<=b) { double F = (x-a)*(x-a)/((b-a)*(c-a)); da = F/(b-a) + F/(c-a) - 2*F/(x-a); db = -F/(b-a); dc = -F/(c-a); dd = 0; } else if(b<x && x<c) { double F1 = (x-b)*(x-b)/((c-b)*(d-b)); double F2 = (x-c)*(x-c)/((c-b)*(c-a)); da = -F2/(c-a); db = 2*F1/(x-b) - F1/(c-b) - F1/(d-b) - F2/(c-b); dc = 2*F2/(x-c) + F2/(c-b) + F2/(c-a) + F1/(c-b); dd = F1/(d-b); } else if(c<=x && x<d) { double F = (x-d)*(x-d)/((d-c)*(d-b)); da = 0; db = F/(d-b); dc = F/(d-c); dd = -F/(d-b) - F/(d-c) - 2*F/(x-d); } if(i>=3) deriv[i-3] = da; if(i>=2 && i<p.length+2) deriv[i-2] = db; if(i>=1 && i<p.length+1) deriv[i-1] = dc; if(i>=0 && i<p.length) deriv[i] = db; return deriv; } public double[] deriv_greq(int i, double x) { double[] deriv = new double[getNumberOfParameters()]; double min = this.min(); double max = this.max(); double[] p = getParamListValues(); double g1 = (p.length>0? p[0] : max) - min; double g2 = max - (p.length>0? p[p.length-1] : min); double a = (i<=2? min+(i-2)*g1 : p[i-3]); double b = (i<=1? min+(i-1)*g1 : (i==p.length+2? max : p[i-2])); double c = (i==0? min : (i>=p.length+1? max+(i-p.length-1)*g2 : p[i-1])); double d = (i>=p.length? max+(i-p.length)*g2 : p[i]); double xmax = (c*d - b*a)/(c+d-b-a); double da = 0; double db = 0; double dc = 0; double dd = 0; if(a<x && x<=b) { double F = (x-a)*(x-a)/((b-a)*(c-a)); da = F/(b-a) + F/(c-a) - 2*F/(x-a); db = -F/(b-a); dc = -F/(c-a); dd = 0; } else if(b<x && x<xmax) { double F1 = (x-b)*(x-b)/((c-b)*(d-b)); double F2 = (x-c)*(x-c)/((c-b)*(c-a)); da = -F2/(c-a); db = 2*F1/(x-b) - F1/(c-b) - F1/(d-b) - F2/(c-b); dc = 2*F2/(x-c) + F2/(c-b) + F2/(c-a) + F1/(c-b); dd = F1/(d-b); } else if(xmax<=x) { double D = (c+d-b-a)*(c+d-b-a); da = (b-c)/D; db = (d-a)/D; dc = (a-d)/D; dd = (c-b)/D; } if(i>=3) deriv[i-3] = da; if(i>=2 && i<p.length+2) deriv[i-2] = db; if(i>=1 && i<p.length+1) deriv[i-1] = dc; if(i>=0 && i<p.length) deriv[i] = db; return deriv; } public double[] deriv_smeq(int i, double x) { double[] deriv = new double[getNumberOfParameters()]; double min = this.min(); double max = this.max(); double[] p = getParamListValues(); double g1 = (p.length>0? p[0] : max) - min; double g2 = max - (p.length>0? p[p.length-1] : min); double a = (i<=2? min+(i-2)*g1 : p[i-3]); double b = (i<=1? min+(i-1)*g1 : (i==p.length+2? max : p[i-2])); double c = (i==0? min : (i>=p.length+1? max+(i-p.length-1)*g2 : p[i-1])); double d = (i>=p.length? max+(i-p.length)*g2 : p[i]); double xmax = (c*d - b*a)/(c+d-b-a); double da = 0; double db = 0; double dc = 0; double dd = 0; if(c<=x && x<d) { double F = (x-d)*(x-d)/((d-c)*(d-b)); da = 0; db = F/(d-b); dc = F/(d-c); dd = -F/(d-b) - F/(d-c) - 2*F/(x-d); } else if(xmax<x && x<c) { double F1 = (x-b)*(x-b)/((c-b)*(d-b)); double F2 = (x-c)*(x-c)/((c-b)*(c-a)); da = -F2/(c-a); db = 2*F1/(x-b) - F1/(c-b) - F1/(d-b) - F2/(c-b); dc = 2*F2/(x-c) + F2/(c-b) + F2/(c-a) + F1/(c-b); dd = F1/(d-b); } else if(x<=xmax) { double D = (c+d-b-a)*(c+d-b-a); da = (b-c)/D; db = (d-a)/D; dc = (a-d)/D; dd = (c-b)/D; } if(i>=3) deriv[i-3] = da; if(i>=2 && i<p.length+2) deriv[i-2] = db; if(i>=1 && i<p.length+1) deriv[i-1] = dc; if(i>=0 && i<p.length) deriv[i] = db; return deriv; } public double[] deriv_center(int i) { double[] deriv = new double[getNumberOfParameters()]; double[] p = getParamListValues(); if(i>=3) deriv[i-3] = 1; if(i>=2 && i<p.length+2) deriv[i-2] = 1; if(i>=1 && i<p.length+1) deriv[i-1] = 1; if(i>=0 && i<p.length) deriv[i] = 1; return deriv; } public double[] deriv_basis(int i) { double[] deriv = new double[getNumberOfParameters()]; double[] p = getParamListValues(); if(i>=3) deriv[i-3] = -1; if(i>=0 && i<p.length) deriv[i] = 1; return deriv; } public boolean test () { double min = this.min(); double max = this.max(); double[] p = getParamListValues(); return ( p.length>0 && p[0]>min && p[p.length-1]<max && sorted(p) ); } public void update() { if(!isAdjustable()) return; double[] pos = get(); double[] desp = getDesp(); boolean[] adj = getAdjustable(); double min = this.min(); double max = this.max(); double step = this.step(); double[] p = getParamListValues(); pos = sortedUpdate(pos,desp,adj); if(pos[0]<=min) { pos[0]=min+step; for(int i=1;i<p.length; i++) { if(pos[i]<=pos[i-1]) pos[i] = pos[i-1]+step; else break; } } if(pos[p.length-1]>=max) { pos[p.length-1]=max-step; for(int i=p.length-2; i>=0; i--) { if(pos[i]>=pos[i+1]) pos[i] = pos[i+1]-step; else break; } } updateValues(pos); } public String getEqualJavaCode() { String eol = System.getProperty("line.separator", "\n"); String code = ""; code += " double g1 = (p.length>0? p[0] : max) - min;"+eol; code += " double g2 = max - (p.length>0? p[p.length-1] : min);"+eol; code += " double a = (i<=2? min+(i-2)*g1 : p[i-3]);"+eol; code += " double b = (i<=1? min+(i-1)*g1 : (i==p.length+2? max : p[i-2]));"+eol; code += " double c = (i==0? min : (i>=p.length+1? max+(i-p.length-1)*g2 : p[i-1]));"+eol; code += " double d = (i>=p.length? max+(i-p.length)*g2 : p[i]);"+eol; code += " if(x<a || x>d) return 0;"+eol; code += " if(x<=b) return (x-a)*(x-a)/((b-a)*(c-a));"+eol; code += " if(x>=c) return (x-d)*(x-d)/((d-c)*(d-b));"+eol; code += " return 1 - (x-b)*(x-b)/((c-b)*(d-b)) - (x-c)*(x-c)/((c-b)*(c-a));"+eol; return code; } public String getGreqJavaCode() { String eol = System.getProperty("line.separator", "\n"); String code = ""; code += " double g1 = (p.length>0? p[0] : max) - min;"+eol; code += " double g2 = max - (p.length>0? p[p.length-1] : min);"+eol; code += " double a = (i<=2? min+(i-2)*g1 : p[i-3]);"+eol; code += " double b = (i<=1? min+(i-1)*g1 : (i==p.length+2? max : p[i-2]));"+eol; code += " double c = (i==0? min : (i>=p.length+1? max+(i-p.length-1)*g2 : p[i-1]));"+eol; code += " double d = (i>=p.length? max+(i-p.length)*g2 : p[i]);"+eol; code += " double xmax = (c*d - b*a)/(c+d-b-a);"+eol; code += " if(x<a) return 0;"+eol; code += " if(x<=b) return (x-a)*(x-a)/((b-a)*(c-a));"+eol; code += " if(x<=xmax) return 1- (x-b)*(x-b)/((c-b)*(d-b)) - (x-c)*(x-c)/((c-b)*(c-a));"+eol; code += " return (d-a)/(c+d-a-b);"+eol; return code; } public String getSmeqJavaCode() { String eol = System.getProperty("line.separator", "\n"); String code = ""; code += " double g1 = (p.length>0? p[0] : max) - min;"+eol; code += " double g2 = max - (p.length>0? p[p.length-1] : min);"+eol; code += " double a = (i<=2? min+(i-2)*g1 : p[i-3]);"+eol; code += " double b = (i<=1? min+(i-1)*g1 : (i==p.length+2? max : p[i-2]));"+eol; code += " double c = (i==0? min : (i>=p.length+1? max+(i-p.length-1)*g2 : p[i-1]));"+eol; code += " double d = (i>=p.length? max+(i-p.length)*g2 : p[i]);"+eol; code += " double xmax = (c*d - b*a)/(c+d-b-a);"+eol; code += " if(x<xmax) return (d-a)/(c+d-a-b);"+eol; code += " if(x<=c) return 1- (x-b)*(x-b)/((c-b)*(d-b)) - (x-c)*(x-c)/((c-b)*(c-a));"+eol; code += " if(x<=d) return (x-d)*(x-d)/((d-c)*(d-b));"+eol; code += " return 0;"+eol; return code; } public String getCenterJavaCode() { String eol = System.getProperty("line.separator", "\n"); String code = ""; code += " double g1 = (p.length>0? p[0] : max) - min;"+eol; code += " double g2 = max - (p.length>0? p[p.length-1] : min);"+eol; code += " double a = (i<=2? min+(i-2)*g1 : p[i-3]);"+eol; code += " double b = (i<=1? min+(i-1)*g1 : (i==p.length+2? max : p[i-2]));"+eol; code += " double c = (i==0? min : (i>=p.length+1? max+(i-p.length-1)*g2 : p[i-1]));"+eol; code += " double d = (i>=p.length? max+(i-p.length)*g2 : p[i]);"+eol; code += " return (c*d - b*a)/(c+d-b-a);"+eol; return code; } public String getBasisJavaCode() { String eol = System.getProperty("line.separator", "\n"); String code = ""; code += " double g1 = (p.length>0? p[0] : max) - min;"+eol; code += " double g2 = max - (p.length>0? p[p.length-1] : min);"+eol; code += " double a = (i<=2? min+(i-2)*g1 : p[i-3]);"+eol; code += " double d = (i>=p.length? max+(i-p.length)*g2 : p[i]);"+eol; code += " return (d-a);"+eol; return code; } public String getEqualCCode() { String eol = System.getProperty("line.separator", "\n"); String code = ""; code += " double g1 = (length>0? p[0] : max) - min;"+eol; code += " double g2 = max - (length>0? p[length-1] : min);"+eol; code += " double a = (i<=2? min+(i-2)*g1 : p[i-3]);"+eol; code += " double b = (i<=1? min+(i-1)*g1 : (i==length+2? max : p[i-2]));"+eol; code += " double c = (i==0? min : (i>=length+1? max+(i-length-1)*g2 : p[i-1]));"+eol; code += " double d = (i>=length? max+(i-length)*g2 : p[i]);"+eol; code += " if(x<a || x>d) return 0;"+eol; code += " if(x<=b) return (x-a)*(x-a)/((b-a)*(c-a));"+eol; code += " if(x>=c) return (x-d)*(x-d)/((d-c)*(d-b));"+eol; code += " return 1 - (x-b)*(x-b)/((c-b)*(d-b)) - (x-c)*(x-c)/((c-b)*(c-a));"+eol; return code; } public String getGreqCCode() { String eol = System.getProperty("line.separator", "\n"); String code = ""; code += " double g1 = (length>0? p[0] : max) - min;"+eol; code += " double g2 = max - (length>0? p[length-1] : min);"+eol; code += " double a = (i<=2? min+(i-2)*g1 : p[i-3]);"+eol; code += " double b = (i<=1? min+(i-1)*g1 : (i==length+2? max : p[i-2]));"+eol; code += " double c = (i==0? min : (i>=length+1? max+(i-length-1)*g2 : p[i-1]));"+eol; code += " double d = (i>=length? max+(i-length)*g2 : p[i]);"+eol; code += " double xmax = (c*d - b*a)/(c+d-b-a);"+eol; code += " if(x<a) return 0;"+eol; code += " if(x<=b) return (x-a)*(x-a)/((b-a)*(c-a));"+eol; code += " if(x<=xmax) return 1- (x-b)*(x-b)/((c-b)*(d-b)) - (x-c)*(x-c)/((c-b)*(c-a));"+eol; code += " return (d-a)/(c+d-a-b);"+eol; return code; } public String getSmeqCCode() { String eol = System.getProperty("line.separator", "\n"); String code = ""; code += " double g1 = (length>0? p[0] : max) - min;"+eol; code += " double g2 = max - (length>0? p[length-1] : min);"+eol; code += " double a = (i<=2? min+(i-2)*g1 : p[i-3]);"+eol; code += " double b = (i<=1? min+(i-1)*g1 : (i==length+2? max : p[i-2]));"+eol; code += " double c = (i==0? min : (i>=length+1? max+(i-length-1)*g2 : p[i-1]));"+eol; code += " double d = (i>=length? max+(i-length)*g2 : p[i]);"+eol; code += " double xmax = (c*d - b*a)/(c+d-b-a);"+eol; code += " if(x<xmax) return (d-a)/(c+d-a-b);"+eol; code += " if(x<=c) return 1- (x-b)*(x-b)/((c-b)*(d-b)) - (x-c)*(x-c)/((c-b)*(c-a));"+eol; code += " if(x<=d) return (x-d)*(x-d)/((d-c)*(d-b));"+eol; code += " return 0;"+eol; return code; } public String getCenterCCode() { String eol = System.getProperty("line.separator", "\n"); String code = ""; code += " double g1 = (length>0? p[0] : max) - min;"+eol; code += " double g2 = max - (length>0? p[length-1] : min);"+eol; code += " double a = (i<=2? min+(i-2)*g1 : p[i-3]);"+eol; code += " double b = (i<=1? min+(i-1)*g1 : (i==length+2? max : p[i-2]));"+eol; code += " double c = (i==0? min : (i>=length+1? max+(i-length-1)*g2 : p[i-1]));"+eol; code += " double d = (i>=length? max+(i-length)*g2 : p[i]);"+eol; code += " return (c*d - b*a)/(c+d-b-a);"+eol; return code; } public String getBasisCCode() { String eol = System.getProperty("line.separator", "\n"); String code = ""; code += " double g1 = (length>0? p[0] : max) - min;"+eol; code += " double g2 = max - (length>0? p[length-1] : min);"+eol; code += " double a = (i<=2? min+(i-2)*g1 : p[i-3]);"+eol; code += " double d = (i>=length? max+(i-length)*g2 : p[i]);"+eol; code += " return (d-a);"+eol; return code; } public String getEqualCppCode() { String eol = System.getProperty("line.separator", "\n"); String code = ""; code += " double g1 = (length>0? p[0] : max) - min;"+eol; code += " double g2 = max - (length>0? p[length-1] : min);"+eol; code += " double a = (i<=2? min+(i-2)*g1 : p[i-3]);"+eol; code += " double b = (i<=1? min+(i-1)*g1 : (i==length+2? max : p[i-2]));"+eol; code += " double c = (i==0? min : (i>=length+1? max+(i-length-1)*g2 : p[i-1]));"+eol; code += " double d = (i>=length? max+(i-length)*g2 : p[i]);"+eol; code += " if(x<a || x>d) return 0;"+eol; code += " if(x<=b) return (x-a)*(x-a)/((b-a)*(c-a));"+eol; code += " if(x>=c) return (x-d)*(x-d)/((d-c)*(d-b));"+eol; code += " return 1 - (x-b)*(x-b)/((c-b)*(d-b)) - (x-c)*(x-c)/((c-b)*(c-a));"+eol; return code; } public String getGreqCppCode() { String eol = System.getProperty("line.separator", "\n"); String code = ""; code += " double g1 = (length>0? p[0] : max) - min;"+eol; code += " double g2 = max - (length>0? p[length-1] : min);"+eol; code += " double a = (i<=2? min+(i-2)*g1 : p[i-3]);"+eol; code += " double b = (i<=1? min+(i-1)*g1 : (i==length+2? max : p[i-2]));"+eol; code += " double c = (i==0? min : (i>=length+1? max+(i-length-1)*g2 : p[i-1]));"+eol; code += " double d = (i>=length? max+(i-length)*g2 : p[i]);"+eol; code += " double xmax = (c*d - b*a)/(c+d-b-a);"+eol; code += " if(x<a) return 0;"+eol; code += " if(x<=b) return (x-a)*(x-a)/((b-a)*(c-a));"+eol; code += " if(x<=xmax) return 1- (x-b)*(x-b)/((c-b)*(d-b)) - (x-c)*(x-c)/((c-b)*(c-a));"+eol; code += " return (d-a)/(c+d-a-b);"+eol; return code; } public String getSmeqCppCode() { String eol = System.getProperty("line.separator", "\n"); String code = ""; code += " double g1 = (length>0? p[0] : max) - min;"+eol; code += " double g2 = max - (length>0? p[length-1] : min);"+eol; code += " double a = (i<=2? min+(i-2)*g1 : p[i-3]);"+eol; code += " double b = (i<=1? min+(i-1)*g1 : (i==length+2? max : p[i-2]));"+eol; code += " double c = (i==0? min : (i>=length+1? max+(i-length-1)*g2 : p[i-1]));"+eol; code += " double d = (i>=length? max+(i-length)*g2 : p[i]);"+eol; code += " double xmax = (c*d - b*a)/(c+d-b-a);"+eol; code += " if(x<xmax) return (d-a)/(c+d-a-b);"+eol; code += " if(x<=c) return 1- (x-b)*(x-b)/((c-b)*(d-b)) - (x-c)*(x-c)/((c-b)*(c-a));"+eol; code += " if(x<=d) return (x-d)*(x-d)/((d-c)*(d-b));"+eol; code += " return 0;"+eol; return code; } public String getCenterCppCode() { String eol = System.getProperty("line.separator", "\n"); String code = ""; code += " double g1 = (length>0? p[0] : max) - min;"+eol; code += " double g2 = max - (length>0? p[length-1] : min);"+eol; code += " double a = (i<=2? min+(i-2)*g1 : p[i-3]);"+eol; code += " double b = (i<=1? min+(i-1)*g1 : (i==length+2? max : p[i-2]));"+eol; code += " double c = (i==0? min : (i>=length+1? max+(i-length-1)*g2 : p[i-1]));"+eol; code += " double d = (i>=length? max+(i-length)*g2 : p[i]);"+eol; code += " return (c*d - b*a)/(c+d-b-a);"+eol; return code; } public String getBasisCppCode() { String eol = System.getProperty("line.separator", "\n"); String code = ""; code += " double g1 = (length>0? p[0] : max) - min;"+eol; code += " double g2 = max - (length>0? p[length-1] : min);"+eol; code += " double a = (i<=2? min+(i-2)*g1 : p[i-3]);"+eol; code += " double d = (i>=length? max+(i-length)*g2 : p[i]);"+eol; code += " return (d-a);"+eol; return code; } }