PageRenderTime 26ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 1ms

/E/LEARN/cle_flatannoterms.c

#
C | 451 lines | 198 code | 74 blank | 179 comment | 4 complexity | 7e8e0056afac22d77bcfbdd28bf1b370 MD5 | raw file
Possible License(s): LGPL-2.1
  1. /*-----------------------------------------------------------------------
  2. File : cle_flatannoterms.c
  3. Author: Stephan Schulz
  4. Contents
  5. Functions for dealing with flat annotated terms.
  6. Copyright 1998, 1999 by the author.
  7. This code is released under the GNU General Public Licence and
  8. the GNU Lesser General Public License.
  9. See the file COPYING in the main E directory for details..
  10. Run "eprover -h" for contact information.
  11. Changes
  12. <1> Mon Aug 9 12:59:39 MET DST 1999
  13. New
  14. -----------------------------------------------------------------------*/
  15. #include "cle_flatannoterms.h"
  16. /*---------------------------------------------------------------------*/
  17. /* Global Variables */
  18. /*---------------------------------------------------------------------*/
  19. /*---------------------------------------------------------------------*/
  20. /* Forward Declarations */
  21. /*---------------------------------------------------------------------*/
  22. /*---------------------------------------------------------------------*/
  23. /* Internal Functions */
  24. /*---------------------------------------------------------------------*/
  25. /*---------------------------------------------------------------------*/
  26. /* Exported Functions */
  27. /*---------------------------------------------------------------------*/
  28. /*-----------------------------------------------------------------------
  29. //
  30. // Function: FlatAnnoTermAlloc()
  31. //
  32. // Return a flatly annotated term.
  33. //
  34. // Global Variables: -
  35. //
  36. // Side Effects : Memory operations
  37. //
  38. /----------------------------------------------------------------------*/
  39. FlatAnnoTerm_p FlatAnnoTermAlloc(Term_p term, double eval, double
  40. eval_weight, long sources)
  41. {
  42. FlatAnnoTerm_p handle = FlatAnnoTermCellAlloc();
  43. handle->term = term;
  44. handle->eval = eval;
  45. handle->eval_weight = eval_weight;
  46. handle->sources = sources;
  47. handle->next = NULL;
  48. return handle;
  49. }
  50. /*-----------------------------------------------------------------------
  51. //
  52. // Function: FlatAnnoTermPrint()
  53. //
  54. // Print a flatly annotated term "t:eval." (mostly for debugging, I
  55. // suppose)
  56. //
  57. // Global Variables: -
  58. //
  59. // Side Effects : Output
  60. //
  61. /----------------------------------------------------------------------*/
  62. void FlatAnnoTermPrint(FILE* out, FlatAnnoTerm_p term, Sig_p sig)
  63. {
  64. TermPrint(out, term->term, sig, DEREF_NEVER);
  65. fprintf(out, " : %f. /* EvalWeight: %f, Id: %ld */", term->eval,
  66. term->eval_weight, term->term->entry_no);
  67. }
  68. /*-----------------------------------------------------------------------
  69. //
  70. // Function: FlatAnnoSetAlloc()
  71. //
  72. // Allocate a flatly annotated term set.
  73. //
  74. // Global Variables: -
  75. //
  76. // Side Effects : Memory operations
  77. //
  78. /----------------------------------------------------------------------*/
  79. FlatAnnoSet_p FlatAnnoSetAlloc(void)
  80. {
  81. FlatAnnoSet_p handle = FlatAnnoSetCellAlloc();
  82. handle->set = NULL;
  83. return handle;
  84. }
  85. /*-----------------------------------------------------------------------
  86. //
  87. // Function: FlatAnnoSetFree()
  88. //
  89. // Free a set of flatly annotated terms.
  90. //
  91. // Global Variables:
  92. //
  93. // Side Effects :
  94. //
  95. /----------------------------------------------------------------------*/
  96. void FlatAnnoSetFree(FlatAnnoSet_p junk)
  97. {
  98. NumTree_p handle;
  99. PStack_p stack;
  100. stack = NumTreeTraverseInit(junk->set);
  101. while((handle = NumTreeTraverseNext(stack)))
  102. {
  103. FlatAnnoTermFree(handle->val1.p_val);
  104. }
  105. NumTreeTraverseExit(stack);
  106. NumTreeFree(junk->set);
  107. FlatAnnoSetCellFree(junk);
  108. }
  109. /*-----------------------------------------------------------------------
  110. //
  111. // Function: FlatAnnoSetPrint()
  112. //
  113. // Print a set o flatly annotated terms (mostly for debugging, I
  114. // suppose)
  115. //
  116. // Global Variables: -
  117. //
  118. // Side Effects : Output
  119. //
  120. /----------------------------------------------------------------------*/
  121. void FlatAnnoSetPrint(FILE* out, FlatAnnoSet_p set, Sig_p sig)
  122. {
  123. NumTree_p cell;
  124. PStack_p stack = NumTreeTraverseInit(set->set);
  125. while((cell = NumTreeTraverseNext(stack)))
  126. {
  127. FlatAnnoTermPrint(out, cell->val1.p_val, sig);
  128. fputc('\n', out);
  129. }
  130. NumTreeTraverseExit(stack);
  131. }
  132. /*-----------------------------------------------------------------------
  133. //
  134. // Function: FlatAnnoSetAddTerm()
  135. //
  136. // Add a flatly annotated term to a set. If the term already exists,
  137. // merge the annotations and free the original annotateted term.
  138. //
  139. // Global Variables: -
  140. //
  141. // Side Effects : Changes set
  142. //
  143. /----------------------------------------------------------------------*/
  144. bool FlatAnnoSetAddTerm(FlatAnnoSet_p set, FlatAnnoTerm_p term)
  145. {
  146. NumTree_p exists;
  147. FlatAnnoTerm_p existing_term;
  148. IntOrP tmp;
  149. bool res = true;
  150. exists = NumTreeFind(&(set->set), term->term->entry_no);
  151. if(exists)
  152. {
  153. res = false;
  154. existing_term = exists->val1.p_val;
  155. existing_term->eval = (term->eval * term->eval_weight +
  156. existing_term->eval *
  157. existing_term->eval_weight)/
  158. (term->eval_weight + existing_term->eval_weight);
  159. existing_term->eval_weight += term->eval_weight;
  160. existing_term->sources += term->sources;
  161. FlatAnnoTermFree(term);
  162. }
  163. else
  164. {
  165. tmp.p_val = term;
  166. NumTreeStore(&(set->set), term->term->entry_no, tmp, tmp);
  167. }
  168. return res;
  169. }
  170. /*-----------------------------------------------------------------------
  171. //
  172. // Function: FlatAnnoSetTranslate()
  173. //
  174. // Given a set of annotated terms with exactly one annotation per
  175. // term, generate a corrsponding flatly annotated term set.
  176. //
  177. // Global Variables: -
  178. //
  179. // Side Effects : Memory operations, changes flatset
  180. //
  181. /----------------------------------------------------------------------*/
  182. long FlatAnnoSetTranslate(FlatAnnoSet_p flatset, AnnoSet_p set, double
  183. weights[])
  184. {
  185. NumTree_p handle;
  186. PStack_p stack;
  187. FlatAnnoTerm_p term;
  188. AnnoTerm_p old;
  189. long res = 0;
  190. bool check;
  191. stack = NumTreeTraverseInit(set->set);
  192. while((handle = NumTreeTraverseNext(stack)))
  193. {
  194. old = handle->val1.p_val;
  195. assert(old->annotation);
  196. assert(!old->annotation->lson);
  197. assert(!old->annotation->lson);
  198. term = FlatAnnoTermAlloc(old->term,
  199. AnnotationEval(old->annotation,
  200. weights),
  201. (double)AnnotationCount(old->annotation)
  202. /*
  203. /(double)TermWeight(old->term, 1, 1)
  204. */
  205. ,
  206. AnnotationCount(old->annotation));
  207. check = FlatAnnoSetAddTerm(flatset, term);
  208. assert(check);
  209. res++;
  210. }
  211. NumTreeTraverseExit(stack);
  212. return res;
  213. }
  214. /*-----------------------------------------------------------------------
  215. //
  216. // Function: FlatAnnoSetSize()
  217. //
  218. // Return the number of terms in a flatanno-set (counting sources).
  219. //
  220. // Global Variables: -
  221. //
  222. // Side Effects : -
  223. //
  224. /----------------------------------------------------------------------*/
  225. long FlatAnnoSetSize(FlatAnnoSet_p fset)
  226. {
  227. NumTree_p handle;
  228. PStack_p stack;
  229. long res = 0;
  230. FlatAnnoTerm_p term;
  231. stack = NumTreeTraverseInit(fset->set);
  232. while((handle = NumTreeTraverseNext(stack)))
  233. {
  234. term = handle->val1.p_val;
  235. res+=term->sources;
  236. }
  237. NumTreeTraverseExit(stack);
  238. return res;
  239. }
  240. /*-----------------------------------------------------------------------
  241. //
  242. // Function: FlatAnnoTermFlatten()
  243. //
  244. // Generate a fresh annoterm for each subterm of term (inheriting
  245. // the original annotation with modiefied weight) and insert it into
  246. // set. Returns number of terms created.
  247. //
  248. // Global Variables: -
  249. //
  250. // Side Effects : Memory operations.
  251. //
  252. /----------------------------------------------------------------------*/
  253. long FlatAnnoTermFlatten(FlatAnnoSet_p set, FlatAnnoTerm_p term)
  254. {
  255. long res = 0;
  256. PStack_p stack = PStackAlloc();
  257. Term_p t;
  258. FlatAnnoTerm_p handle;
  259. int i;
  260. PStackPushP(stack, term->term);
  261. while(!PStackEmpty(stack))
  262. {
  263. t = PStackPopP(stack);
  264. handle = FlatAnnoTermAlloc(t, term->eval, term->eval_weight,
  265. term->sources);
  266. FlatAnnoSetAddTerm(set, handle);
  267. res++;
  268. for(i=0; i<t->arity; i++)
  269. {
  270. assert(t->args);
  271. PStackPushP(stack, t->args[i]);
  272. }
  273. }
  274. assert(PStackEmpty(stack));
  275. PStackFree(stack);
  276. return res;
  277. }
  278. /*-----------------------------------------------------------------------
  279. //
  280. // Function: FlatAnnoSetFlatten()
  281. //
  282. // For all terms in to_flatten and all subterms, insert them into
  283. // set. Return number of terms created.
  284. //
  285. // Global Variables: -
  286. //
  287. // Side Effects : By FlatAnnoTermFlatten()
  288. //
  289. /----------------------------------------------------------------------*/
  290. long FlatAnnoSetFlatten(FlatAnnoSet_p set, FlatAnnoSet_p to_flatten)
  291. {
  292. NumTree_p handle;
  293. PStack_p stack;
  294. long res = 0;
  295. stack = NumTreeTraverseInit(to_flatten->set);
  296. while((handle = NumTreeTraverseNext(stack)))
  297. {
  298. res+=FlatAnnoTermFlatten(set, handle->val1.p_val);
  299. }
  300. NumTreeTraverseExit(stack);
  301. return res;
  302. }
  303. /*-----------------------------------------------------------------------
  304. //
  305. // Function: FlatAnnoSetEvalAverage()
  306. //
  307. // Return the average of all evaluation for terms in set.
  308. //
  309. // Global Variables: -
  310. //
  311. // Side Effects : -
  312. //
  313. /----------------------------------------------------------------------*/
  314. double FlatAnnoSetEvalAverage(FlatAnnoSet_p set)
  315. {
  316. NumTree_p handle;
  317. PStack_p stack;
  318. long sources = 0;
  319. double res = 0;
  320. FlatAnnoTerm_p term;
  321. if(!set->set)
  322. {
  323. return 0;
  324. }
  325. stack = NumTreeTraverseInit(set->set);
  326. while((handle = NumTreeTraverseNext(stack)))
  327. {
  328. term = handle->val1.p_val;
  329. res+=term->eval;
  330. sources+=term->sources;
  331. }
  332. NumTreeTraverseExit(stack);
  333. return res/(double)sources;
  334. }
  335. /*-----------------------------------------------------------------------
  336. //
  337. // Function: FlatAnnoSetEvalWeightedAverage()
  338. //
  339. // Return the weighted average of all evaluation for terms in set.
  340. //
  341. // Global Variables: -
  342. //
  343. // Side Effects : -
  344. //
  345. /----------------------------------------------------------------------*/
  346. double FlatAnnoSetEvalWeightedAverage(FlatAnnoSet_p set)
  347. {
  348. NumTree_p handle;
  349. PStack_p stack;
  350. double weight = 0;
  351. double res = 0;
  352. FlatAnnoTerm_p term;
  353. if(!set->set)
  354. {
  355. return 0;
  356. }
  357. stack = NumTreeTraverseInit(set->set);
  358. while((handle = NumTreeTraverseNext(stack)))
  359. {
  360. term = handle->val1.p_val;
  361. res+=term->eval_weight*term->eval;
  362. weight+=term->eval_weight;
  363. }
  364. NumTreeTraverseExit(stack);
  365. return res/weight;
  366. }
  367. /*---------------------------------------------------------------------*/
  368. /* End of File */
  369. /*---------------------------------------------------------------------*/