Пример #1
0
Файл: lncky.c Проект: mjpost/cky
int      
main(int argc, char **argv)
{
  si_t          si = make_si(1024);
  FILE          *grammarfp = stdin, *yieldfp;
  FILE		*tracefp = NULL;  	/* trace output */
  FILE		*summaryfp = stderr;	/* end of parse stats output */
  FILE		*parsefp = stdout;      /* parse trees */
  FILE		*probfp = NULL;         /* max_neglog_prob */

  chart_cell	root_cell;
  grammar	g;
  chart		c;
  vindex 	terms;
  int		maxsentlen = 0;
  int           sentenceno = 0, parsed_sentences = 0, failed_sentences = 0;
  double	sum_neglog_prob = 0;
  int           sentfrom = 0;
  int           sentto = 0;

  srand(RAND_SEED);	/* seed random number generator */

  if (argc<2 || argc>6) {
    fprintf(stderr, "%s yieldfile [maxsentlen [grammarfile [sentfrom sentto]]]\n", argv[0]);
    exit(EXIT_FAILURE);
  }

  if ((yieldfp = fopen(argv[1], "r")) == NULL) {
    fprintf(stderr, "%s: Couldn't open yieldfile %s\n", argv[0], argv[1]);
    exit(EXIT_FAILURE);
  }

  if (argc >= 3)
    if (!sscanf(argv[2], "%d", &maxsentlen)) {
      fprintf(stderr, "%s: Couldn't parse maxsentlen %s\n", argv[0], argv[2]);
      exit(EXIT_FAILURE);
    }

  if (argc >= 4)
    if ((grammarfp = fopen(argv[3], "r")) == NULL) {
      fprintf(stderr, "%s: Couldn't open grammarfile %s\n", argv[0], argv[3]);
      exit(EXIT_FAILURE);
    }

  if (argc >= 6) {
    if (!sscanf(argv[4], "%d", &sentfrom)) {
      fprintf(stderr, "%s: Couldn't parse sentfrom %s\n", argv[0], argv[4]);
      exit(EXIT_FAILURE);
    }
    if (!sscanf(argv[5], "%d", &sentto)) {
      fprintf(stderr, "%s: Couldn't parse sentto %s\n", argv[0], argv[5]);
      exit(EXIT_FAILURE);
    }
  }

  g = read_grammar(grammarfp, si);
  /* write_grammar(tracefp, g, si); */

  while ((terms = read_terms(yieldfp, si))) {
    sentenceno++;

    if (sentfrom && sentenceno < sentfrom) {
      vindex_free(terms);
      continue;
    }
    if (sentto && sentenceno > sentto) {
      vindex_free(terms);
      break;
    }

    /* skip if sentence is too long */
    if (!maxsentlen || (int) terms->n <= maxsentlen) { 
      size_t	i;

      if (tracefp) {
	fprintf(tracefp, "\nSentence %d:\n", sentenceno);
	for (i=0; i<terms->n; i++)
	  fprintf(tracefp, " %s", si_index_string(si, terms->e[i]));
	fprintf(tracefp, "\n");
      }
     
      c = cky(*terms, g, si);

      /* fetch best root node */

      root_cell = sihashcc_ref(CHART_ENTRY(c, 0, terms->n), g.root_label);

      if (root_cell) {
	tree parse_tree = bintree_tree(&root_cell->tree, si);
	double prob = (double) root_cell->prob;

	parsed_sentences++;
	assert(prob > 0.0);
	sum_neglog_prob -= log(prob);

	if (probfp)
	  fprintf(probfp, "max_neglog_prob(%d, %g).\n", 
		  sentenceno, -log(prob)); 

	if (tracefp) 
	  fprintf(tracefp, " Prob = %g\n", prob);

	if (parsefp) {
	  write_tree(parsefp, parse_tree, si);
	  fprintf(parsefp, "\n");
	  /* write_prolog_tree(parsefp, parse_tree, si); */
	}

	free_tree(parse_tree);
      }

      else {
	failed_sentences++;
	if (tracefp)
	  fprintf(tracefp, "Failed to parse\n");
	if (parsefp)
	  fprintf(parsefp, "parse_failure.\n");
      }

      chart_free(c, terms->n);			/* free the chart */
    }
    else { 					/* sentence too long */
      if (parsefp)
	fprintf(parsefp, "too_long.\n");
    }

    vindex_free(terms);				/*  free the terms */
    assert(trees_allocated == 0);
    assert(bintrees_allocated == 0);
  }
  free_grammar(g);
  si_free(si);

  if (summaryfp) {
    fprintf(summaryfp, "\n%d/%d = %g%% test sentences met the length criteron,"
	    " of which %d/%d = %g%% were parsed\n", 
	    parsed_sentences+failed_sentences, sentenceno,
	    (double) (100.0 * (parsed_sentences+failed_sentences)) / 
	                       sentenceno,
	    parsed_sentences, parsed_sentences+failed_sentences, 
	    (double) (100.0 * parsed_sentences) / 
                              (parsed_sentences + failed_sentences));
    fprintf(summaryfp, "Sum(-log prob) = %g\n", sum_neglog_prob);
  }

  /* check that everything has been deallocated */
  /* printf("mmm_blocks_allocated = %ld\n", (long) mmm_blocks_allocated); */
  assert(mmm_blocks_allocated == 0);		
  exit(EXIT_SUCCESS);
}
Пример #2
0
void Wind::localon()
  {
  int evt=0;
  int mask=0;
  XSetWindowAttributes attributes;
  XGCValues gcv;

  XGetGCValues(dsp,gtbknd(),GCForeground,&gcv);

  attributes.background_pixel=gcv.foreground;
  mask|=CWBackPixel;

  if(pixmap)
    {
    attributes.background_pixmap=pixmap;
    mask|=CWBackPixmap;
    }

  if(cursor)
    {
    attributes.cursor=cursor;
    mask|=CWCursor;
    }

  // FIXME!
/*
  if(x->funcs->expose || x->target && x->target->funcs->expose) evt|=ExposureMask;
  if(x->funcs->enternotify || x->target && x->target->funcs->enternotify) evt|=EnterWindowMask;
  if(x->funcs->leavenotify || x->target && x->target->funcs->leavenotify) evt|=LeaveWindowMask;
  if(x->funcs->buttonpress || x->target && x->target->funcs->buttonpress) evt|=ButtonPressMask;
  if(x->funcs->buttonrelease || x->target && x->target->funcs->buttonrelease) evt|=ButtonReleaseMask;
  if(x->funcs->motionnotify || x->target && x->target->funcs->motionnotify) evt|=ButtonMotionMask;
  if(x->funcs->keypress || x->target && x->target->funcs->keypress) evt|=KeyPressMask|KeyReleaseMask;
  if(x->funcs->configurenotify && gtmom(x)==gtmain(root)) evt|=StructureNotifyMask;
  if(x->funcs->focusin || x->funcs->focusout) evt|=FocusChangeMask;
*/

  evt|=ExposureMask;
  evt|=EnterWindowMask;
  evt|=LeaveWindowMask;
  evt|=ButtonReleaseMask;
  evt|=ButtonMotionMask;
  evt|=KeyPressMask;
  evt|=KeyReleaseMask;
  evt|=StructureNotifyMask;
  evt|=FocusChangeMask;
  evt|=ButtonPressMask;

  attributes.event_mask=evt;
  mask|=CWEventMask;

  if(override_flag)
    {
    attributes.override_redirect=1;
    }
  else attributes.override_redirect=0;
  mask|=CWOverrideRedirect;

  /* Create window */
  win=XCreateWindow(dsp,gtmom()->gtwin(),gtx(),gty(),gtwidth(),gtheight(),0,
                    CopyFromParent,InputOutput,CopyFromParent,
                    mask,&attributes);

  /* Duh, this should be the default */
  if(in==root->gtmain())
    hintinput(target,True);

  if(in==root->gtmain() && ckx() && cky())
    {
    hintposition(target,gtx(),gty());
    }

  if(target && target->hints)
    sendhints(win,target->hints);

  if(transient_flag)
    XSetTransientForHint(dsp,win,gtmom()->gtwin());

  /* Map and raise window */
  XMapRaised(dsp,win);

  if(XSaveContext(dsp,win,wins,(XPointer)this))
    {
    printf("Error\n");
    exit(1);
    }
  }