1 8 package org.lsmp.djep.djep; 9 import java.util.*; 10 import org.nfunk.jep.*; 11 import org.lsmp.djep.xjep.*; 12 13 26 public class DVariable extends XVariable 27 { 28 protected Hashtable derivatives = new Hashtable(); 29 30 protected PartialDerivative createDerivative(String derivnames[],Node eqn) 31 { 32 return new PartialDerivative(this,derivnames,eqn); 33 } 34 38 protected DVariable(String name) 39 { 40 super(name); 41 } 42 43 protected DVariable(String name,Object value) 44 { 45 super(name,value); 46 } 47 48 49 public void setEquation(Node eqn) 50 { 51 super.setEquation(eqn); 52 derivatives.clear(); 53 } 54 55 56 public void invalidateAll() 57 { 58 setValidValue(false); 59 for(Enumeration e = derivatives.elements(); e.hasMoreElements(); ) 60 { 61 PartialDerivative deriv = (PartialDerivative) e.nextElement(); 62 deriv.setValidValue(false); 63 } 64 } 65 72 public static String makeDerivString(String rootname,String dnames[]) 73 { 74 StringBuffer sb = new StringBuffer (); 75 sb.append('d'); 76 if( dnames.length!= 1) sb.append("^" + dnames.length); 77 sb.append(rootname); 78 sb.append('/'); 79 for(int i=0;i<dnames.length;++i) 81 { 82 sb.append('d'); 83 sb.append(dnames[i]); 84 } 85 return sb.toString(); 86 87 } 88 89 private String [] sortedNames(String names[]) 90 { 91 String newnames[] = new String [names.length]; 92 System.arraycopy(names,0,newnames,0,names.length); 93 Arrays.sort(newnames); 94 return newnames; 95 } 96 100 public void setDerivative(String derivnames[],PartialDerivative eqn) 101 { 102 String newnames[] = sortedNames(derivnames); 103 derivatives.put(makeDerivString(name,newnames),eqn); 104 } 105 106 public void setDerivativeSorted(String derivnames[],PartialDerivative eqn) 107 { 108 derivatives.put(makeDerivString(name,derivnames),eqn); 109 } 110 111 116 public PartialDerivative getDerivative(String derivnames[]) 117 { 118 String newnames[] = sortedNames(derivnames); 119 return (PartialDerivative) derivatives.get(makeDerivString(name,newnames)); 120 } 121 122 public PartialDerivative getDerivativeSorted(String derivnames[]) 123 { 124 return (PartialDerivative) derivatives.get(makeDerivString(name,derivnames)); 125 } 126 127 128 140 public PartialDerivative findDerivativeSorted(String derivnames[],DJep jep) 141 throws ParseException 142 { 143 if(getEquation()==null) return null; 144 145 if(derivnames == null) throw new ParseException("findDerivativeSorted: Null array of names"); 146 PartialDerivative res = getDerivativeSorted(derivnames); 147 if(res!=null) return res; 148 149 int origlen = derivnames.length; 151 Node lowereqn; if(origlen < 1) 153 throw new ParseException("findDerivativeSorted: Empty Array of names"); 154 else if(origlen == 1) 155 lowereqn = getEquation(); 156 else 157 { 158 String newnames[] = new String [origlen-1]; 159 for(int i=0;i<origlen-1;++i) 160 newnames[i]=derivnames[i]; 161 lowereqn = findDerivativeSorted(newnames,jep).getEquation(); 162 } 163 if(lowereqn==null) 164 { 165 return null; 166 } 167 Node deriv = (Node) jep.differentiate(lowereqn,derivnames[origlen-1]); 168 Node simp = (Node) jep.simplify(deriv); 169 res = createDerivative(derivnames,simp); 170 setDerivative(derivnames,res); 171 return res; 172 } 173 174 public PartialDerivative findDerivative(String derivnames[],DJep jep) 175 throws ParseException 176 { 177 String newnames[] = sortedNames(derivnames); 178 return findDerivativeSorted(newnames,jep); 179 } 180 181 public PartialDerivative findDerivative(String derivname,DJep jep) 182 throws ParseException 183 { 184 String newnames[] = new String [1]; 185 newnames[0]=derivname; 186 return findDerivativeSorted(newnames,jep); 187 } 188 189 public PartialDerivative findDerivative(PartialDerivative deriv,String name,DJep jep) 190 throws ParseException 191 { 192 int len = deriv.getDnames().length; 193 String newnames[] = new String [len+1]; 194 System.arraycopy(deriv.getDnames(),0,newnames,0,len); 195 newnames[len]=name; 196 return findDerivative(newnames,jep); 197 } 198 199 public void print(PrintVisitor bpv) 200 { 201 StringBuffer sb = new StringBuffer (name); 202 sb.append(": "); 203 if(hasValidValue()) sb.append(" val "+getValue() ); 204 else sb.append(" val invalid"); 205 sb.append(" "); 206 if(getEquation()!=null) sb.append(bpv.toString(getEquation())); 207 sb.append("\n"); 208 for(Enumeration e = derivatives.elements(); e.hasMoreElements(); ) 209 { 210 PartialDerivative var = (PartialDerivative) e.nextElement(); 211 sb.append("\t"+var.toString()+": "); 212 if(var.hasValidValue()) sb.append(" val "+var.getValue() ); 213 else sb.append(" val invalid"); 214 sb.append(" "); 215 sb.append(bpv.toString(var.getEquation())); 216 sb.append("\n"); 217 } 218 System.out.print(sb.toString()); 219 } 220 221 225 237 } 238 | Popular Tags |