PageRenderTime 54ms CodeModel.GetById 19ms RepoModel.GetById 1ms app.codeStats 0ms

/src/xfuzzy/xfcpp/XfcppSpecCppCode.java

https://github.com/dayse/gesplan
Java | 1133 lines | 864 code | 116 blank | 153 comment | 183 complexity | 564bbeb2b9da946d50059fbd9d720335 MD5 | raw file
  1. //--------------------------------------------------------------------------------//
  2. // COPYRIGHT NOTICE //
  3. //--------------------------------------------------------------------------------//
  4. // Copyright (c) 2012, Instituto de Microelectronica de Sevilla (IMSE-CNM) //
  5. // //
  6. // All rights reserved. //
  7. // //
  8. // Redistribution and use in source and binary forms, with or without //
  9. // modification, are permitted provided that the following conditions are met: //
  10. // //
  11. // * Redistributions of source code must retain the above copyright notice, //
  12. // this list of conditions and the following disclaimer. //
  13. // //
  14. // * Redistributions in binary form must reproduce the above copyright //
  15. // notice, this list of conditions and the following disclaimer in the //
  16. // documentation and/or other materials provided with the distribution. //
  17. // //
  18. // * Neither the name of the IMSE-CNM nor the names of its contributors may //
  19. // be used to endorse or promote products derived from this software //
  20. // without specific prior written permission. //
  21. // //
  22. // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" //
  23. // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE //
  24. // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE //
  25. // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE //
  26. // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL //
  27. // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR //
  28. // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER //
  29. // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, //
  30. // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE //
  31. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. //
  32. //--------------------------------------------------------------------------------//
  33. package xfuzzy.xfcpp;
  34. import xfuzzy.lang.*;
  35. import java.io.*;
  36. import java.util.Vector;
  37. /**
  38. * Generador del fichero "fuzzysystem.cpp"
  39. *
  40. * @author Francisco José Moreno Velo
  41. *
  42. */
  43. public class XfcppSpecCppCode {
  44. //----------------------------------------------------------------------------//
  45. // MIEMBROS PRIVADOS //
  46. //----------------------------------------------------------------------------//
  47. /**
  48. * Sistema difuso a tratar
  49. */
  50. private Specification spec;
  51. /**
  52. * Directorio en el que se va a crear el archivo ".hpp"
  53. */
  54. private File dir;
  55. //----------------------------------------------------------------------------//
  56. // CONSTRUCTOR //
  57. //----------------------------------------------------------------------------//
  58. /**
  59. * Constructor
  60. */
  61. public XfcppSpecCppCode(Specification spec, File dir) {
  62. this.spec = spec;
  63. this.dir = dir;
  64. }
  65. //----------------------------------------------------------------------------//
  66. // MÉTODOS PÚBLICOS ESTÁTICOS //
  67. //----------------------------------------------------------------------------//
  68. /**
  69. * Genera el archivo ".cpp" correspondiente a la especificación en el
  70. * directorio indicado
  71. */
  72. public static final String create(Specification spec, File dir)
  73. throws XflException {
  74. XfcppSpecCppCode creator = new XfcppSpecCppCode(spec, dir);
  75. creator.createFile();
  76. return creator.getMessage();
  77. }
  78. //----------------------------------------------------------------------------//
  79. // MÉTODOS PÚBLICOS //
  80. //----------------------------------------------------------------------------//
  81. /**
  82. * Devuelve la descripción del resultado de la compilación
  83. */
  84. public String getMessage() {
  85. File file = new File(dir,spec.getName()+".cpp");
  86. return file.getAbsolutePath();
  87. }
  88. /**
  89. * Genera el fichero ".cpp"
  90. */
  91. public void createFile() throws XflException {
  92. File file = new File(dir,spec.getName()+".cpp");
  93. try {
  94. OutputStream os = new FileOutputStream(file);
  95. PrintStream stream = new PrintStream(os);
  96. printHeading(stream);
  97. printSource(stream);
  98. stream.close();
  99. }
  100. catch (IOException e) {}
  101. }
  102. //----------------------------------------------------------------------------//
  103. // MÉTODOS PRIVADOS //
  104. //----------------------------------------------------------------------------//
  105. /**
  106. * Genera el código de cabecera del fichero
  107. */
  108. private void printHeading(PrintStream stream) {
  109. stream.println("//++++++++++++++++++++++++++++++++++++++++++++++++++++++//");
  110. stream.println("// //");
  111. stream.println(complete("// File: "+spec.getName()+".cpp"));
  112. stream.println("// //");
  113. stream.println("// Author: Automatically generated by Xfuzzy //");
  114. stream.println("// //");
  115. stream.println("//++++++++++++++++++++++++++++++++++++++++++++++++++++++//");
  116. stream.println();
  117. }
  118. /**
  119. * Genera el código de las clases del sistema
  120. */
  121. private void printSource(PrintStream stream) throws XflException {
  122. String name = spec.getName();
  123. Operatorset[] opset = spec.getOperatorsets();
  124. Type[] type = spec.getTypes();
  125. Rulebase[] base = spec.getRulebases();
  126. CrispBlock[] crisp = spec.getCrispBlockSet().getBlocks();
  127. stream.println("#ifndef _"+name+"_INFERENCE_ENGINE_");
  128. stream.println("#define _"+name+"_INFERENCE_ENGINE_");
  129. stream.println();
  130. stream.println("#include <stdio.h>");
  131. stream.println("#include <math.h>");
  132. stream.println("#include \"xfuzzy.hpp\"");
  133. stream.println("#include \""+name+".hpp\"");
  134. stream.println();
  135. Vector famv = searchFamilyClasses();
  136. for(int i=0; i<famv.size(); i++) {
  137. printFamilyCppCode(stream,(Family) famv.elementAt(i));
  138. }
  139. Vector mfv = searchMFClasses();
  140. for(int i=0; i<mfv.size(); i++) {
  141. printMFCppCode(stream,(ParamMemFunc) mfv.elementAt(i));
  142. }
  143. for(int i=0; i<opset.length; i++) printOperatorSetCode(stream,opset[i]);
  144. for(int i=0; i<type.length; i++) printTypeCode(stream,type[i]);
  145. printSystemCode(stream);
  146. for(int i=0; i<base.length; i++) printRulebaseCode(stream,base[i]);
  147. for(int i=0; i<crisp.length; i++) printCrispBlockCode(stream,crisp[i]);
  148. stream.println("#endif /* _"+name+"_INFERENCE_ENGINE_ */");
  149. }
  150. //----------------------------------------------------------------------------//
  151. // Métodos que generan el codigo de las MF //
  152. //----------------------------------------------------------------------------//
  153. /**
  154. * Decripción de una función de pertenencia familiar
  155. */
  156. private void printFamilyCppCode(PrintStream stream,Family fam) throws XflException {
  157. String spname = spec.getName();
  158. String pkgname = fam.getPackageName();
  159. String classname = "FMF_"+spname+"_"+pkgname+"_"+fam.getFunctionName();
  160. String equal = fam.getEqualCppCode();
  161. String listname = fam.getParamListName();
  162. Parameter[] single = fam.getSingleParameters();
  163. boolean haslist = (listname != null && listname.length() > 0);
  164. if(equal==null || equal.length()==0) throw new XflException();
  165. stream.println("//++++++++++++++++++++++++++++++++++++++++++++++++++++++//");
  166. stream.println(complete("// MembershipFunction "+classname));
  167. stream.println("//++++++++++++++++++++++++++++++++++++++++++++++++++++++//");
  168. stream.println();
  169. stream.println("//------------------------------------------------------//");
  170. stream.println("// Constructor //");
  171. stream.println("//------------------------------------------------------//");
  172. stream.println();
  173. stream.print(classname+"::"+classname+"(int i,double min,double max,double step");
  174. stream.println(",double *single,double *list,int length) :");
  175. stream.println("ParamMembershipFunction(min,max,step) {");
  176. stream.println(" this->name = \""+classname+"\";");
  177. stream.println(" this->i = i;");
  178. for(int i=0; i<single.length; i++) {
  179. stream.println(" this->"+single[i].getName()+" = single["+i+"];");
  180. }
  181. if(listname != null && listname.length() > 0) {
  182. stream.println(" this->length = length;");
  183. stream.println(" this->"+listname+" = new double[length];");
  184. stream.println(" for(int i=0; i<length; i++) this->"+listname+"[i] = list[i];");
  185. }
  186. stream.println("}");
  187. stream.println();
  188. stream.println("//------------------------------------------------------//");
  189. stream.println("// Function to get a clone of the object //");
  190. stream.println("//------------------------------------------------------//");
  191. stream.println();
  192. stream.println(classname+" * "+classname+"::dup() {");
  193. stream.print(" double _param["+single.length+"] = {");
  194. for(int i=0; i<single.length; i++) {
  195. stream.print((i==0? "":",")+single[i].getName());
  196. }
  197. stream.println("};");
  198. if(haslist) {
  199. stream.println(" double *_list = this->"+listname+";");
  200. stream.println(" int _length = this->length;");
  201. } else {
  202. stream.println(" double *_list = NULL;");
  203. stream.println(" int _length = 0;");
  204. }
  205. stream.println(" return new "+classname+"(i,min,max,step,_param,_list,_length);");
  206. stream.println("}");
  207. stream.println();
  208. stream.println("//------------------------------------------------------//");
  209. stream.println("// Function to get a parameter of the function //");
  210. stream.println("//------------------------------------------------------//");
  211. stream.println();
  212. stream.println("double "+classname+"::param(int _i) {");
  213. if(single.length == 0 && haslist) {
  214. stream.println(" return "+listname+"[_i];");
  215. } else if(!haslist) {
  216. stream.println(" switch(_i) {");
  217. for(int i=0; i<single.length; i++) {
  218. stream.println(" case "+i+": return "+single[i].getName()+";");
  219. }
  220. stream.println(" default: return 0;");
  221. stream.println(" }");
  222. } else {
  223. stream.print(" if(_i>="+single.length+")");
  224. stream.println(" return "+listname+"[_i-"+single.length+"];");
  225. stream.println(" switch(_i) {");
  226. for(int i=0; i<single.length; i++) {
  227. stream.println(" case "+i+": return "+single[i].getName()+";");
  228. }
  229. stream.println(" default: return 0;");
  230. stream.println(" }");
  231. }
  232. stream.println("}");
  233. stream.println();
  234. stream.println("//------------------------------------------------------//");
  235. stream.println("// Function to compute the membership degree //");
  236. stream.println("//------------------------------------------------------//");
  237. stream.println();
  238. stream.println("double "+classname+"::compute_eq(double x) {");
  239. stream.println(equal);
  240. stream.println("}");
  241. stream.println();
  242. String greq = fam.getGreqCppCode();
  243. if(greq != null && greq.length()>0) {
  244. stream.println("//------------------------------------------------------//");
  245. stream.println("// Compute the Greater_or_equal membership degree //");
  246. stream.println("//------------------------------------------------------//");
  247. stream.println();
  248. stream.println("double "+classname+"::compute_greq(double x) {");
  249. stream.println(greq);
  250. stream.println("}");
  251. stream.println();
  252. }
  253. String smeq = fam.getSmeqCppCode();
  254. if(smeq != null && smeq.length()>0) {
  255. stream.println("//------------------------------------------------------//");
  256. stream.println("// Compute the Smaller_or_equal membership degree //");
  257. stream.println("//------------------------------------------------------//");
  258. stream.println();
  259. stream.println("double "+classname+"::compute_smeq(double x) {");
  260. stream.println(smeq);
  261. stream.println("}");
  262. stream.println();
  263. }
  264. String center = fam.getCenterCppCode();
  265. if(center != null && center.length()>0) {
  266. stream.println("//------------------------------------------------------//");
  267. stream.println("// Function to get the center of the MF //");
  268. stream.println("//------------------------------------------------------//");
  269. stream.println();
  270. stream.println("double "+classname+"::center() {");
  271. stream.println(center);
  272. stream.println("}");
  273. stream.println();
  274. }
  275. String basis = fam.getBasisCppCode();
  276. if(basis != null && basis.length()>0) {
  277. stream.println("//------------------------------------------------------//");
  278. stream.println("// Function to get the basis of the MF //");
  279. stream.println("//------------------------------------------------------//");
  280. stream.println();
  281. stream.println("double "+classname+"::basis() {");
  282. stream.println(basis);
  283. stream.println("}");
  284. stream.println();
  285. }
  286. }
  287. /**
  288. * Descripción de una función de pertenencia
  289. */
  290. private void printMFCppCode(PrintStream stream,ParamMemFunc mf) throws XflException {
  291. String spname = spec.getName();
  292. String pkgname = mf.getPackageName();
  293. String classname = "MF_"+spname+"_"+pkgname+"_"+mf.getFunctionName();
  294. String equal = mf.getEqualCppCode();
  295. String listname = mf.getParamListName();
  296. Parameter[] single = mf.getSingleParameters();
  297. boolean haslist = (listname != null && listname.length() > 0);
  298. if(equal==null || equal.length()==0) throw new XflException();
  299. stream.println("//++++++++++++++++++++++++++++++++++++++++++++++++++++++//");
  300. stream.println(complete("// MembershipFunction "+classname));
  301. stream.println("//++++++++++++++++++++++++++++++++++++++++++++++++++++++//");
  302. stream.println();
  303. stream.println("//------------------------------------------------------//");
  304. stream.println("// Constructor //");
  305. stream.println("//------------------------------------------------------//");
  306. stream.println();
  307. stream.print(classname+"::"+classname+"(double min,double max,double step");
  308. stream.println(",double *single,double *list, int length) :");
  309. stream.println("ParamMembershipFunction(min,max,step) {");
  310. stream.println(" this->name = \""+classname+"\";");
  311. for(int i=0; i<single.length; i++) {
  312. stream.println(" this->"+single[i].getName()+" = single["+i+"];");
  313. }
  314. if(haslist) {
  315. stream.println(" this->length = length;");
  316. stream.println(" this->"+listname+" = new double[length];");
  317. stream.println(" for(int i=0; i<length; i++) this->list[i] = list[i];");
  318. } else {
  319. }
  320. stream.println("}");
  321. stream.println();
  322. stream.println("//------------------------------------------------------//");
  323. stream.println("// Function to get a clone of the object //");
  324. stream.println("//------------------------------------------------------//");
  325. stream.println();
  326. stream.println(classname+" * "+classname+"::dup() {");
  327. stream.print(" double _param["+single.length+"] = {");
  328. for(int i=0; i<single.length; i++) {
  329. stream.print((i==0? "":",")+single[i].getName());
  330. }
  331. stream.println("};");
  332. if(haslist) {
  333. stream.println(" double *_list = this->"+listname+";");
  334. stream.println(" int _length = this->length;");
  335. } else {
  336. stream.println(" double *_list = NULL;");
  337. stream.println(" int _length = 0;");
  338. }
  339. stream.println(" return new "+classname+"(min,max,step,_param,_list,_length);");
  340. stream.println("}");
  341. stream.println();
  342. stream.println("//------------------------------------------------------//");
  343. stream.println("// Function to get a parameter of the function //");
  344. stream.println("//------------------------------------------------------//");
  345. stream.println();
  346. stream.println("double "+classname+"::param(int _i) {");
  347. if(single.length == 0 && haslist) {
  348. stream.println(" return "+listname+"[_i];");
  349. } else if(!haslist) {
  350. stream.println(" switch(_i) {");
  351. for(int i=0; i<single.length; i++) {
  352. stream.println(" case "+i+": return "+single[i].getName()+";");
  353. }
  354. stream.println(" default: return 0;");
  355. stream.println(" }");
  356. } else {
  357. stream.print(" if(_i>="+single.length+")");
  358. stream.println(" return "+listname+"[_i-"+single.length+"];");
  359. stream.println(" switch(_i) {");
  360. for(int i=0; i<single.length; i++) {
  361. stream.println(" case "+i+": return "+single[i].getName()+";");
  362. }
  363. stream.println(" default: return 0;");
  364. stream.println(" }");
  365. }
  366. stream.println("}");
  367. stream.println();
  368. stream.println("//------------------------------------------------------//");
  369. stream.println("// Function to compute the membership degree //");
  370. stream.println("//------------------------------------------------------//");
  371. stream.println();
  372. stream.println("double "+classname+"::compute_eq(double x) {");
  373. stream.println(equal);
  374. stream.println("}");
  375. stream.println();
  376. String greq = mf.getGreqCppCode();
  377. if(greq != null && greq.length()>0) {
  378. stream.println("//------------------------------------------------------//");
  379. stream.println("// Compute the Greater_or_equal membership degree //");
  380. stream.println("//------------------------------------------------------//");
  381. stream.println();
  382. stream.println("double "+classname+"::compute_greq(double x) {");
  383. stream.println(greq);
  384. stream.println("}");
  385. stream.println();
  386. }
  387. String smeq = mf.getSmeqCppCode();
  388. if(smeq != null && smeq.length()>0) {
  389. stream.println("//------------------------------------------------------//");
  390. stream.println("// Compute the Smaller_or_equal membership degree //");
  391. stream.println("//------------------------------------------------------//");
  392. stream.println();
  393. stream.println("double "+classname+"::compute_smeq(double x) {");
  394. stream.println(smeq);
  395. stream.println("}");
  396. stream.println();
  397. }
  398. String center = mf.getCenterCppCode();
  399. if(center != null && center.length()>0) {
  400. stream.println("//------------------------------------------------------//");
  401. stream.println("// Function to get the center of the MF //");
  402. stream.println("//------------------------------------------------------//");
  403. stream.println();
  404. stream.println("double "+classname+"::center() {");
  405. stream.println(center);
  406. stream.println("}");
  407. stream.println();
  408. }
  409. String basis = mf.getBasisCppCode();
  410. if(basis != null && basis.length()>0) {
  411. stream.println("//------------------------------------------------------//");
  412. stream.println("// Function to get the basis of the MF //");
  413. stream.println("//------------------------------------------------------//");
  414. stream.println();
  415. stream.println("double "+classname+"::basis() {");
  416. stream.println(basis);
  417. stream.println("}");
  418. stream.println();
  419. }
  420. }
  421. //----------------------------------------------------------------------------//
  422. // Métodos que generan la estructura global //
  423. //----------------------------------------------------------------------------//
  424. /**
  425. * Descripción de la estructura global del sistema
  426. */
  427. private void printSystemCode(PrintStream stream) {
  428. String spname = spec.getName();
  429. SystemModule system = spec.getSystemModule();
  430. Variable input[] = system.getInputs();
  431. Variable output[] = system.getOutputs();
  432. Variable inner[] = system.getInners();
  433. ModuleCall call[] = system.getModuleCalls();
  434. stream.println("//++++++++++++++++++++++++++++++++++++++++++++++++++++++//");
  435. stream.println("// Inference Engine //");
  436. stream.println("//++++++++++++++++++++++++++++++++++++++++++++++++++++++//");
  437. stream.println();
  438. stream.println("//------------------------------------------------------//");
  439. stream.println("// Inference from crisp numbers giving crisp numbers //");
  440. stream.println("//------------------------------------------------------//");
  441. stream.println();
  442. stream.println("double* "+spname+"::crispInference(double *_input) {");
  443. for(int i=0; i<input.length; i++)
  444. stream.println(" FuzzySingleton "+input[i]+"(_input["+i+"]);");
  445. stream.print(" MembershipFunction ");
  446. for(int i=0; i<output.length; i++) stream.print((i!=0? ", *": "*")+output[i]);
  447. for(int i=1; i<inner.length; i++) stream.print(", *"+inner[i]);
  448. stream.println(";");
  449. for(int i=0; i<call.length; i++) if(call[i] instanceof RulebaseCall) {
  450. printRulebaseCallCode(stream, (RulebaseCall) call[i]);
  451. } else printCrispBlockCallCode(stream, (CrispBlockCall) call[i]);
  452. stream.println(" double *_output = new double["+output.length+"];");
  453. for(int i=0; i<output.length; i++) {
  454. stream.print(" if("+output[i]+"->getType() == MembershipFunction::CRISP) ");
  455. stream.print("_output["+i+"] = ((FuzzySingleton *) ");
  456. stream.println(output[i]+")->getValue();");
  457. stream.print(" else _output["+i+"] = ((OutputMembershipFunction *) ");
  458. stream.println(output[i]+")->defuzzify();");
  459. }
  460. for(int i=0; i<output.length; i++) stream.println(" delete "+output[i]+";");
  461. for(int i=1; i<inner.length; i++) stream.println(" delete "+inner[i]+";");
  462. stream.println(" return _output;");
  463. stream.println("}");
  464. stream.println();
  465. stream.println("//------------------------------------------------------//");
  466. stream.println("// Inference from fuzzy numbers giving crisp numbers //");
  467. stream.println("//------------------------------------------------------//");
  468. stream.println();
  469. stream.print("double* "+spname+"::crispInference");
  470. stream.println("(MembershipFunction* &_input) {");
  471. for(int i=0; i<input.length; i++)
  472. stream.println(" MembershipFunction & "+input[i]+" = _input["+i+"];");
  473. stream.print(" MembershipFunction ");
  474. for(int i=0; i<output.length; i++) stream.print((i!=0? ", *": "*")+output[i]);
  475. for(int i=1; i<inner.length; i++) stream.print(", *"+inner[i]);
  476. stream.println(";");
  477. for(int i=0; i<call.length; i++) if(call[i] instanceof RulebaseCall) {
  478. printRulebaseCallCode(stream, (RulebaseCall) call[i]);
  479. } else printCrispBlockCallCode(stream, (CrispBlockCall) call[i]);
  480. stream.println(" double *_output = new double["+output.length+"];");
  481. for(int i=0; i<output.length; i++) {
  482. stream.print(" if("+output[i]+"->getType() == MembershipFunction::CRISP) ");
  483. stream.print("_output["+i+"] = ((FuzzySingleton *) ");
  484. stream.println(output[i]+")->getValue();");
  485. stream.print(" else _output["+i+"] = ((OutputMembershipFunction *) ");
  486. stream.println(output[i]+")->defuzzify();");
  487. }
  488. for(int i=0; i<output.length; i++) stream.println(" delete "+output[i]+";");
  489. for(int i=1; i<inner.length; i++) stream.println(" delete "+inner[i]+";");
  490. stream.println(" return _output;");
  491. stream.println("}");
  492. stream.println();
  493. stream.println("//------------------------------------------------------//");
  494. stream.println("// Inference from crisp numbers giving fuzzy numbers //");
  495. stream.println("//------------------------------------------------------//");
  496. stream.println();
  497. stream.print("MembershipFunction** "+spname+"::fuzzyInference");
  498. stream.println("(double *_input) {");
  499. for(int i=0; i<input.length; i++)
  500. stream.println(" FuzzySingleton "+input[i]+"(_input["+i+"]);");
  501. stream.print(" MembershipFunction ");
  502. for(int i=0; i<output.length; i++) stream.print((i!=0? ", *": "*")+output[i]);
  503. for(int i=1; i<inner.length; i++) stream.print(", *"+inner[i]);
  504. stream.println(";");
  505. for(int i=0; i<call.length; i++) if(call[i] instanceof RulebaseCall) {
  506. printRulebaseCallCode(stream, (RulebaseCall) call[i]);
  507. } else printCrispBlockCallCode(stream, (CrispBlockCall) call[i]);
  508. for(int i=1; i<inner.length; i++) stream.println(" delete "+inner[i]+";");
  509. stream.print(" MembershipFunction **_output = ");
  510. stream.println("new (MembershipFunction *)["+output.length+"];");
  511. for(int i=0; i<output.length; i++)
  512. stream.println(" _output["+i+"] = "+output[i]+";");
  513. stream.println(" return _output;");
  514. stream.println("}");
  515. stream.println();
  516. stream.println("//------------------------------------------------------//");
  517. stream.println("// Inference from fuzzy numbers giving fuzzy numbers //");
  518. stream.println("//------------------------------------------------------//");
  519. stream.println();
  520. stream.print("MembershipFunction** "+spname+"::fuzzyInference");
  521. stream.println("(MembershipFunction* &_input) {");
  522. for(int i=0; i<input.length; i++)
  523. stream.println(" MembershipFunction & "+input[i]+" = _input["+i+"];");
  524. stream.print(" MembershipFunction ");
  525. for(int i=0; i<output.length; i++) stream.print((i!=0? ", *": "*")+output[i]);
  526. for(int i=1; i<inner.length; i++) stream.print(", *"+inner[i]);
  527. stream.println(";");
  528. for(int i=0; i<call.length; i++) if(call[i] instanceof RulebaseCall) {
  529. printRulebaseCallCode(stream, (RulebaseCall) call[i]);
  530. } else printCrispBlockCallCode(stream, (CrispBlockCall) call[i]);
  531. for(int i=1; i<inner.length; i++) stream.println(" delete "+inner[i]+";");
  532. stream.print(" MembershipFunction **_output = ");
  533. stream.println("new (MembershipFunction *)["+output.length+"];");
  534. for(int i=0; i<output.length; i++)
  535. stream.println(" _output["+i+"] = "+output[i]+";");
  536. stream.println(" return _output;");
  537. stream.println("}");
  538. stream.println();
  539. stream.println("//------------------------------------------------------//");
  540. stream.println("// Crisp Inference with single variables (not arrays) //");
  541. stream.println("//------------------------------------------------------//");
  542. stream.println();
  543. stream.print("void "+spname+"::inference(");
  544. for(int i=0; i<input.length; i++) stream.print((i!=0?",":"")+" double _i_"+input[i]);
  545. for(int i=0; i<output.length; i++) stream.print( ", double *_o_"+output[i]);
  546. stream.println(" ) {");
  547. for(int i=0; i<input.length; i++)
  548. stream.println(" FuzzySingleton "+input[i]+"(_i_"+input[i]+");");
  549. stream.print(" MembershipFunction ");
  550. for(int i=0; i<output.length; i++) stream.print((i!=0? ", *": "*")+output[i]);
  551. for(int i=1; i<inner.length; i++) stream.print(", *"+inner[i]);
  552. stream.println(";");
  553. for(int i=0; i<call.length; i++) if(call[i] instanceof RulebaseCall) {
  554. printRulebaseCallCode( stream,(RulebaseCall) call[i]);
  555. } else printCrispBlockCallCode( stream,(CrispBlockCall) call[i]);
  556. for(int i=0; i<output.length; i++) {
  557. stream.print(" if("+output[i]+"->getType() == MembershipFunction::CRISP) ");
  558. stream.print("(*_o_"+output[i]+") = ((FuzzySingleton *) ");
  559. stream.println(output[i]+")->getValue();");
  560. stream.print(" else (*_o_"+output[i]+") = ((OutputMembershipFunction *) ");
  561. stream.println(output[i]+")->defuzzify();");
  562. }
  563. for(int i=0; i<output.length; i++) stream.println(" delete "+output[i]+";");
  564. for(int i=1; i<inner.length; i++) stream.println(" delete "+inner[i]+";");
  565. stream.println("}");
  566. stream.println();
  567. }
  568. /**
  569. * Descripción de una llamada a una base de reglas
  570. */
  571. private void printRulebaseCallCode(PrintStream stream,RulebaseCall call) {
  572. Rulebase base = call.getRulebase();
  573. Variable[] inputvar = call.getInputVariables();
  574. Variable[] outputvar = call.getOutputVariables();
  575. stream.print(" RL_"+base+"(");
  576. for(int i=0; i < inputvar.length; i++) {
  577. if(inputvar[i].isInput()) stream.print((i==0? "" : ", ")+inputvar[i]);
  578. else stream.print((i==0? "*" : ", *")+inputvar[i]);
  579. }
  580. for(int i=0; i < outputvar.length; i++) stream.print(", &"+outputvar[i]);
  581. stream.println(");");
  582. }
  583. /**
  584. * Descripción de una llamada a un bloque no difuso
  585. */
  586. private void printCrispBlockCallCode(PrintStream stream,CrispBlockCall call) {
  587. Variable[] inputvar = call.getInputVariables();
  588. Variable outputvar = call.getOutputVariable();
  589. stream.print(" "+outputvar+" = new FuzzySingleton(");
  590. stream.print(" CB_"+call.getName()+"(");
  591. for(int i=0; i < inputvar.length; i++) {
  592. if(inputvar[i].isInput()) stream.print((i==0? "" : ", ")+inputvar[i]);
  593. else stream.print((i==0? "*" : ", *")+inputvar[i]);
  594. }
  595. stream.println(") );");
  596. }
  597. //----------------------------------------------------------------------------//
  598. // Métodos que generan los conjuntos de operadores //
  599. //----------------------------------------------------------------------------//
  600. /**
  601. * Descripción de un conjunto de operadores
  602. */
  603. private void printOperatorSetCode(PrintStream stream,Operatorset opset) throws XflException {
  604. String opname = "OP_"+spec.getName()+"_"+opset.getName();
  605. stream.println("//++++++++++++++++++++++++++++++++++++++++++++++++++++++//");
  606. stream.println(complete("// Operatorset "+opname));
  607. stream.println("//++++++++++++++++++++++++++++++++++++++++++++++++++++++//");
  608. stream.println();
  609. stream.println("//------------------------------------------------------//");
  610. stream.println("// Description of the operator AND //");
  611. stream.println("//------------------------------------------------------//");
  612. stream.println();
  613. createBinaryCode(stream,opset.and, opname+"::_and");
  614. stream.println("//------------------------------------------------------//");
  615. stream.println("// Description of the operator OR //");
  616. stream.println("//------------------------------------------------------//");
  617. stream.println();
  618. createBinaryCode(stream,opset.or, opname+"::_or");
  619. stream.println("//------------------------------------------------------//");
  620. stream.println("// Description of the operator ALSO //");
  621. stream.println("//------------------------------------------------------//");
  622. stream.println();
  623. createBinaryCode(stream,opset.also, opname+"::_also");
  624. stream.println("//------------------------------------------------------//");
  625. stream.println("// Description of the operator IMPLICATION //");
  626. stream.println("//------------------------------------------------------//");
  627. stream.println();
  628. createBinaryCode(stream,opset.imp, opname+"::_imp");
  629. stream.println("//------------------------------------------------------//");
  630. stream.println("// Description of the operator NOT //");
  631. stream.println("//------------------------------------------------------//");
  632. stream.println();
  633. createUnaryCode(stream,opset.not, opname+"::_not");
  634. stream.println("//------------------------------------------------------//");
  635. stream.println("// Description of the operator STRONGLY //");
  636. stream.println("//------------------------------------------------------//");
  637. stream.println();
  638. createUnaryCode(stream,opset.very, opname+"::_very");
  639. stream.println("//------------------------------------------------------//");
  640. stream.println("// Description of the operator MORE OR LESS //");
  641. stream.println("//------------------------------------------------------//");
  642. stream.println();
  643. createUnaryCode(stream,opset.moreorless, opname+"::_moreorless");
  644. stream.println("//------------------------------------------------------//");
  645. stream.println("// Description of the operator SLIGHTLY //");
  646. stream.println("//------------------------------------------------------//");
  647. stream.println();
  648. createUnaryCode(stream,opset.slightly, opname+"::_slightly");
  649. stream.println("//------------------------------------------------------//");
  650. stream.println("// Description of the defuzzification method //");
  651. stream.println("//------------------------------------------------------//");
  652. stream.println();
  653. createDefuzCode(stream,opset.defuz, opname+"::_defuz");
  654. }
  655. /**
  656. * Descripción de un operador binario
  657. */
  658. private void createBinaryCode(PrintStream stream, Binary op, String name) throws XflException {
  659. String listname = op.getParamListName();
  660. Parameter single[] = op.getSingleParameters();
  661. Parameter list[] = op.getParamList();
  662. stream.println("double "+name+"(double a, double b) {");
  663. for(int i=0; i<single.length; i++) {
  664. stream.println(" double "+single[i].getName()+" = "+single[i].value+";");
  665. }
  666. if(listname != null && listname.length()>0) {
  667. stream.print(" double "+listname+"["+list.length+"] = {");
  668. for(int i=0; i<list.length; i++)
  669. stream.print((i>0? ",":"")+list[i].value);
  670. stream.println("};");
  671. }
  672. stream.println(op.getCppCode());
  673. stream.println("}");
  674. stream.println();
  675. }
  676. /**
  677. * Descripción de un operador unario
  678. */
  679. private void createUnaryCode(PrintStream stream, Unary op, String name) throws XflException {
  680. String listname = op.getParamListName();
  681. Parameter single[] = op.getSingleParameters();
  682. Parameter list[] = op.getParamList();
  683. stream.println("double "+name+"(double a) {");
  684. for(int i=0; i<single.length; i++) {
  685. stream.println(" double "+single[i].getName()+" = "+single[i].value+";");
  686. }
  687. if(listname != null && listname.length()>0) {
  688. stream.print(" double "+listname+"["+list.length+"] = {");
  689. for(int i=0; i<list.length; i++)
  690. stream.print((i>0? ",":"")+list[i].value);
  691. stream.println("};");
  692. }
  693. stream.println(op.getCppCode());
  694. stream.println("}");
  695. stream.println();
  696. }
  697. /**
  698. * Descripción de un método de concreción
  699. */
  700. private void createDefuzCode(PrintStream stream, DefuzMethod op, String name)
  701. throws XflException {
  702. String listname = op.getParamListName();
  703. Parameter single[] = op.getSingleParameters();
  704. Parameter list[] = op.getParamList();
  705. String defuzcode = op.getCppCode();
  706. stream.println("double "+name+"(OutputMembershipFunction &mf) {");
  707. if(defuzcode.indexOf("min")!=-1) stream.println( " double min = mf.min();");
  708. if(defuzcode.indexOf("max")!=-1) stream.println(" double max = mf.max();");
  709. if(defuzcode.indexOf("step")!=-1) stream.println(" double step = mf.step();");
  710. for(int i=0; i<single.length; i++) {
  711. stream.println( " double "+single[i].getName()+" = "+single[i].value+";" );
  712. }
  713. if(listname != null && listname.length()>0) {
  714. stream.print(" double "+listname+"["+list.length+"] = {");
  715. for(int i=0; i<list.length; i++)
  716. stream.print( (i>0? ",":"")+list[i].value );
  717. stream.println( "};" );
  718. }
  719. stream.println(defuzcode);
  720. stream.println("}");
  721. stream.println();
  722. }
  723. //----------------------------------------------------------------------------//
  724. // Métodos que generan los tipos de variables //
  725. //----------------------------------------------------------------------------//
  726. /**
  727. * Descripción de un tipo de variable linguistica
  728. */
  729. private void printTypeCode(PrintStream stream,Type type) throws XflException {
  730. String specname = spec.getName();
  731. String typename = "TP_"+specname+"_"+type.getName();
  732. Universe u = type.getUniverse();
  733. Family[] fam = type.getFamilies();
  734. LinguisticLabel[] allmf = type.getAllMembershipFunctions();
  735. stream.println("//++++++++++++++++++++++++++++++++++++++++++++++++++++++//");
  736. stream.println(complete("// Type "+typename));
  737. stream.println("//++++++++++++++++++++++++++++++++++++++++++++++++++++++//");
  738. stream.println();
  739. stream.println("//------------------------------------------------------//");
  740. stream.println("// Constructor //");
  741. stream.println("//------------------------------------------------------//");
  742. stream.println();
  743. stream.println(typename+"::"+typename+"() {");
  744. stream.println(" min = "+u.min()+";");
  745. stream.println(" max = "+u.max()+";");
  746. stream.println(" step = "+u.step()+";");
  747. for(int i=0; i<fam.length; i++) {
  748. Parameter single[] = fam[i].getSingleParameters();
  749. stream.print(" double _pfs_"+fam[i]+"[] = { ");
  750. for(int j=0; j<single.length; j++) stream.print((j==0? "":",")+single[j].value);
  751. stream.println(" };");
  752. Parameter list[] = fam[i].getParamList();
  753. int listlength = (list == null? 0 : list.length);
  754. stream.print(" double _pfl_"+fam[i]+"[] = { ");
  755. for(int j=0; j<listlength; j++) stream.print((j==0? "":",")+list[j].value);
  756. stream.println(" };");
  757. }
  758. for(int i=0; i<allmf.length; i++) if(allmf[i] instanceof ParamMemFunc) {
  759. ParamMemFunc pmf = (ParamMemFunc) allmf[i];
  760. Parameter single[] = pmf.getSingleParameters();
  761. stream.print(" double _ps_"+pmf.getLabel()+"[] = { ");
  762. for(int j=0; j<single.length; j++) stream.print((j==0? "":",")+single[j].value);
  763. stream.println(" };");
  764. Parameter list[] = pmf.getParamList();
  765. int listlength = (list == null? 0 : list.length);
  766. stream.print(" double _pl_"+pmf.getLabel()+"[] = { ");
  767. for(int j=0; j<listlength; j++) stream.print((j==0? "":",")+list[j].value);
  768. stream.println(" };");
  769. }
  770. for(int i=0; i<allmf.length; i++) {
  771. if(allmf[i] instanceof ParamMemFunc) {
  772. ParamMemFunc pmf = (ParamMemFunc) allmf[i];
  773. String pkgname = pmf.getPackageName();
  774. Parameter list[] = pmf.getParamList();
  775. int length = (list == null? 0 : list.length);
  776. String mfname = "MF_"+specname+"_"+pkgname+"_"+pmf.getFunctionName();
  777. stream.print(" "+pmf.getLabel()+" = "+mfname);
  778. stream.print("(min,max,step,");
  779. stream.println("_ps_"+pmf.getLabel()+",_pl_"+pmf.getLabel()+","+length+");");
  780. } else {
  781. FamiliarMemFunc fmf = (FamiliarMemFunc) allmf[i];
  782. Family fammf = fmf.getFamily();
  783. int index = fmf.getIndex();
  784. String pkgname = fammf.getPackageName();
  785. Parameter list[] = fammf.getParamList();
  786. int length = (list == null? 0 : list.length);
  787. String mfname = "FMF_"+specname+"_"+pkgname+"_"+fammf.getFunctionName();
  788. stream.print(" "+fmf.getLabel()+" = "+mfname+"("+index+",min,max,step");
  789. stream.println( ",_pfs_"+fammf+",_pfl_"+fammf+","+length+");");
  790. }
  791. }
  792. stream.println("}");
  793. stream.println();
  794. }
  795. //----------------------------------------------------------------------------//
  796. // Métodos que generan las bases de reglas //
  797. //----------------------------------------------------------------------------//
  798. /**
  799. * Descripción de una base de reglas
  800. */
  801. private void printRulebaseCode(PrintStream stream,Rulebase base) throws XflException {
  802. String spname = spec.getName();
  803. String rbname = "RL_"+base.getName();
  804. Variable[] inputvar = base.getInputs();
  805. Variable[] outputvar = base.getOutputs();
  806. Operatorset operation = base.getOperatorset();
  807. Rule[] rule = base.getRules();
  808. stream.println( "//------------------------------------------------------//" );
  809. stream.println( complete("// Rulebase "+rbname) );
  810. stream.println( "//------------------------------------------------------//" );
  811. stream.println();
  812. stream.print( "void "+spname+"::"+rbname+"(" );
  813. for(int i=0; i<inputvar.length; i++)
  814. stream.print( (i==0? "": ", ")+"MembershipFunction &"+inputvar[i] );
  815. for(int i=0; i<outputvar.length; i++)
  816. stream.print( ", MembershipFunction ** _o_"+outputvar[i] );
  817. stream.println( ") {" );
  818. stream.println( " OP_"+spname+"_"+operation.getName()+" _op;" );
  819. stream.println( " double _rl;" );
  820. for(int i=0; i<outputvar.length; i++)
  821. stream.println( " int _i_"+outputvar[i]+"=0;" );
  822. stream.println( " double *_input = new double["+inputvar.length+"];" );
  823. for(int i=0; i<inputvar.length; i++)
  824. stream.println( " _input["+i+"] = "+inputvar[i]+".getValue();" );
  825. for(int i=0; i<outputvar.length; i++) {
  826. stream.print( " OutputMembershipFunction *"+outputvar[i] );
  827. stream.print( " = new OutputMembershipFunction(" );
  828. stream.print( "new OP_"+spname+"_"+operation.getName()+"()," );
  829. stream.println( base.computeOutputSize(i)+","+inputvar.length+",_input);");
  830. }
  831. for(int i=0; i<inputvar.length; i++)
  832. stream.println( " TP_"+spname+"_"+inputvar[i].getType()+" _t_"+inputvar[i]+";");
  833. for(int i=0; i<outputvar.length; i++)
  834. stream.println( " TP_"+spname+"_"+outputvar[i].getType()+" _t_"+outputvar[i]+";");
  835. for(int i=0; i<rule.length; i++) createRuleCode(stream, rule[i]);
  836. if(operation.defuz.isDefault())
  837. for(int i=0; i<outputvar.length; i++)
  838. stream.println( " *_o_"+outputvar[i]+" = "+outputvar[i]+";");
  839. else for(int i=0; i<outputvar.length; i++) {
  840. stream.print( " *_o_"+outputvar[i] );
  841. stream.println( " = new FuzzySingleton( (*"+outputvar[i]+").defuzzify());");
  842. stream.println( " delete "+outputvar[i]+";" );
  843. }
  844. stream.println(" delete _input;");
  845. stream.println("}");
  846. stream.println();
  847. }
  848. /**
  849. * Descripción de una regla
  850. */
  851. private void createRuleCode(PrintStream stream, Rule rule) throws XflException {
  852. double degree = rule.getDegree();
  853. Relation premise = rule.getPremise();
  854. Conclusion[] conc = rule.getConclusions();
  855. stream.print(" _rl = ");
  856. if(degree != 1.0) stream.print(degree+"*");
  857. stream.println(createRelationCode(premise)+";");
  858. for(int j=0; j<conc.length; j++) stream.println(createConclusionCode(conc[j]));
  859. }
  860. /**
  861. * Descripción de la conclusión de una regla
  862. */
  863. private String createConclusionCode(Conclusion conc) throws XflException {
  864. Variable var = conc.getVariable();
  865. LinguisticLabel mf = conc.getMembershipFunction();
  866. String code = " (*"+var+").conc[_i_"+var+"] = new RuleConclusion(_rl, ";
  867. code += "_t_"+var+"."+mf+".dup());";
  868. code += " _i_"+var+"++;";
  869. return code;
  870. }
  871. /**
  872. * Descripción de una proposicion
  873. */
  874. private String createRelationCode(Relation rel) throws XflException {
  875. Variable var = rel.getVariable();
  876. LinguisticLabel mf = rel.getMembershipFunction();
  877. Relation l = rel.getLeftRelation();
  878. Relation r = rel.getRightRelation();
  879. switch(rel.getKind()) {
  880. case Relation.AND:
  881. return "_op._and("+createRelationCode(l)+","+createRelationCode(r)+")";
  882. case Relation.OR:
  883. return "_op._or("+createRelationCode(l)+","+createRelationCode(r)+")";
  884. case Relation.IS:
  885. return "_t_"+var+"."+mf.getLabel()+".isEqual("+var+")";
  886. case Relation.ISNOT:
  887. return "_t_"+var+"."+mf.getLabel()+".isNotEqual("+var+", _op)";
  888. case Relation.GR_EQ:
  889. return "_t_"+var+"."+mf.getLabel()+".isGreaterOrEqual("+var+")";
  890. case Relation.SM_EQ:
  891. return "_t_"+var+"."+mf.getLabel()+".isSmallerOrEqual("+var+")";
  892. case Relation.GREATER:
  893. return "_t_"+var+"."+mf.getLabel()+".isGreater("+var+", _op)";
  894. case Relation.SMALLER:
  895. return "_t_"+var+"."+mf.getLabel()+".isSmaller("+var+", _op)";
  896. case Relation.APP_EQ:
  897. return "_t_"+var+"."+mf.getLabel()+".isApproxEqual("+var+", _op)";
  898. case Relation.VERY_EQ:
  899. return "_t_"+var+"."+mf.getLabel()+".isVeryEqual("+var+", _op)";
  900. case Relation.SL_EQ:
  901. return "_t_"+var+"."+mf.getLabel()+".isSlightlyEqual("+var+", _op)";
  902. case Relation.NOT:
  903. return "_op._not("+createRelationCode(r)+")";
  904. case Relation.MoL:
  905. return "_op._moreorless("+createRelationCode(r)+")";
  906. case Relation.SLIGHTLY:
  907. return "_op.slightly("+createRelationCode(r)+")";
  908. case Relation.VERY:
  909. return "_op._very("+createRelationCode(r)+")";
  910. default: return "";
  911. }
  912. }
  913. //----------------------------------------------------------------------------//
  914. // Métodos que generan el código de un bloque no difuso //
  915. //----------------------------------------------------------------------------//
  916. /**
  917. * Descripción de un bloque no difuso
  918. */
  919. private void printCrispBlockCode(PrintStream stream,CrispBlock crisp) throws XflException {
  920. String spname = spec.getName();
  921. String cbname = "CB_"+crisp.getName();
  922. int inputs = crisp.inputs();
  923. stream.println("//------------------------------------------------------//");
  924. stream.println(complete("// CrsipBlock "+cbname));
  925. stream.println("//------------------------------------------------------//");
  926. stream.println();
  927. stream.print("double "+spname+"::"+cbname+"(");
  928. for(int i=0; i<inputs; i++) stream.print((i==0?"":", ")+"MembershipFunction &_i"+i);
  929. stream.println(") {");
  930. Parameter singleparam[] = crisp.getSingleParameters();
  931. for(int i=0; i<singleparam.length; i++) {
  932. stream.print(" double "+singleparam[i].getName());
  933. stream.println(" = "+singleparam[i].value+";");
  934. }
  935. if(crisp.hasParamList()) {
  936. Parameter paramlist[] = crisp.getParamList();
  937. int listlength = (paramlist == null? 0 : paramlist.length);
  938. stream.print(" double "+crisp.getParamListName()+"["+listlength+"] = {");
  939. for(int i=0; i<listlength; i++)
  940. stream.print((i>0? ",":"")+paramlist[i].value);
  941. stream.println("};");
  942. }
  943. stream.println(" double x["+inputs+"];");
  944. stream.println();
  945. for(int i=0; i<inputs; i++) {
  946. stream.println(" if(_i"+i+".getType() == MembershipFunction::CRISP) {");
  947. stream.println(" x["+i+"] = ((FuzzySingleton &) _i"+i+").getValue();");
  948. stream.println(" } else {");
  949. stream.println(" x["+i+"] = ((OutputMembershipFunction &) _i"+i+").defuzzify();");
  950. stream.println(" }");
  951. stream.println();
  952. }
  953. stream.println(crisp.getCppCode());
  954. stream.println("}");
  955. stream.println();
  956. }
  957. //----------------------------------------------------------------------------//
  958. // Métodos auxiliares //
  959. //----------------------------------------------------------------------------//
  960. /**
  961. * Busca las familias de funciones de pertenencia incluidas
  962. */
  963. private Vector searchFamilyClasses() {
  964. Vector nmv = new Vector();
  965. Vector famv = new Vector();
  966. Type[] type = spec.getTypes();
  967. String spname = spec.getName();
  968. for(int i=0; i<type.length; i++) {
  969. Family[] fam = type[i].getFamilies();
  970. for(int j=0; j<fam.length; j++) {
  971. String pkgname = fam[j].getPackageName();
  972. String classname = "FMF_"+spname+"_"+pkgname+"_"+fam[j].getFunctionName();
  973. boolean included = false;
  974. for(int k=0; k<nmv.size(); k++)
  975. if(classname.equals( (String) nmv.elementAt(k) )) included = true;
  976. if(!included) {
  977. nmv.addElement(classname);
  978. famv.addElement(fam[j]);
  979. }
  980. }
  981. }
  982. return famv;
  983. }
  984. /**
  985. * Busca las funciones de pertenencia incluidas
  986. */
  987. private Vector searchMFClasses() {
  988. Vector nmv = new Vector();
  989. Vector mfv = new Vector();
  990. Type[] type = spec.getTypes();
  991. String spname = spec.getName();
  992. for(int i=0; i<type.length; i++) {
  993. ParamMemFunc[] mf = type[i].getParamMembershipFunctions();
  994. for(int j=0; j<mf.length; j++) {
  995. String pkgname = mf[j].getPackageName();
  996. String classname = "MF_"+spname+"_"+pkgname+"_"+mf[j].getFunctionName();
  997. boolean included = false;
  998. for(int k=0; k<nmv.size(); k++)
  999. if(classname.equals( (String) nmv.elementAt(k) )) included = true;
  1000. if(!included) {
  1001. nmv.addElement(classname);
  1002. mfv.addElement(mf[j]);
  1003. }
  1004. }
  1005. }
  1006. return mfv;
  1007. }
  1008. /**
  1009. * Completa la cadena hasta 58 caracteres
  1010. */
  1011. private String complete(String begining) {
  1012. String line = begining;
  1013. for(int i=begining.length(); i<56; i++) line += " ";
  1014. line += "//";
  1015. return line;
  1016. }
  1017. }