/* -*-C-*-
 ********************************************************************************
 *
 * File:        bestfirst.h  (Formerly bestfirst.h)
 * Description:  Best first search functions
 * Author:       Mark Seaman, OCR Technology
 * Created:      Mon May 14 11:23:29 1990
 * Modified:     Mon Apr 29 14:21:57 1991 (Mark Seaman) marks@hpgrlt
 * Language:     C
 * Package:      N/A
 * Status:       Experimental (Do Not Distribute)
 *
 * (c) Copyright 1990, Hewlett-Packard Company.
 ** Licensed under the Apache License, Version 2.0 (the "License");
 ** you may not use this file except in compliance with the License.
 ** You may obtain a copy of the License at
 ** http://www.apache.org/licenses/LICENSE-2.0
 ** Unless required by applicable law or agreed to in writing, software
 ** distributed under the License is distributed on an "AS IS" BASIS,
 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 ** See the License for the specific language governing permissions and
 ** limitations under the License.
 *
 *******************************************************************************/

#ifndef BESTFIRST_H
#define BESTFIRST_H

/*----------------------------------------------------------------------
              I n c l u d e s
----------------------------------------------------------------------*/

#include "associate.h"
#include "blobs.h"
#include "closed.h"
#include "oldheap.h"
#include "ratngs.h"
#include "seam.h"
#include "states.h"
#include "stopper.h"
#include "tessclas.h"

/*----------------------------------------------------------------------
              T y p e s
----------------------------------------------------------------------*/
struct SEARCH_RECORD
{
  HEAP *open_states;
  HASH_TABLE closed_states;
  STATE *this_state;
  STATE *first_state;
  STATE *best_state;
  int num_joints;
  long num_states;
  long before_best;
  WERD_CHOICE *best_choice;
  WERD_CHOICE *raw_choice;
};

/*----------------------------------------------------------------------
              V a r i a b l e s
---------------------------------------------------------------------*/
extern int num_seg_states;
extern int num_popped;

/*----------------------------------------------------------------------
              M a c r o s
---------------------------------------------------------------------*/
/**********************************************************************
 * chunks_gap
 *
 * Return the width of several of the chunks (if they were joined to-
 * gether.
 **********************************************************************/
#define chunks_gap(chunk_widths,last_chunk)                    \
((last_chunk < (chunk_widths)->num_chars - 1) ?  \
	((chunk_widths)->widths[last_chunk * 2 + 1]) :  \
	(0))

/*----------------------------------------------------------------------
              F u n c t i o n s
----------------------------------------------------------------------*/
void init_bestfirst_vars();


int chunks_width(WIDTH_RECORD *width_record, int start_chunk, int last_chunk);

void delete_search(SEARCH_RECORD *the_search);

void expand_node(FLOAT32 worst_priority,
                 CHUNKS_RECORD *chunks_record,
                 SEARCH_RECORD *the_search);

SEARCH_RECORD *new_search(CHUNKS_RECORD *chunks_record,
                          int num_joints,
                          WERD_CHOICE *best_choice,
                          WERD_CHOICE *raw_choice,
                          STATE *state);

STATE *pop_queue(HEAP *queue);

void push_queue(HEAP *queue, STATE *state,
                FLOAT32 worst_priority, FLOAT32 priority);

void replace_char_widths(CHUNKS_RECORD *chunks_record, SEARCH_STATE state);

// Joins blobs between index x and y, hides corresponding seams and
// returns classification of the resulting merged blob.
BLOB_CHOICE_LIST *join_blobs_and_classify(TBLOB *blobs, SEAMS seam_list,
                                          int x, int y, int fx);

/*
#if defined(__STDC__) || defined(__cplusplus)
# define	_ARGS(s) s
#else
# define	_ARGS(s) ()
#endif*/

/* bestfirst.c
void init_bestfirst_vars
  _ARGS((void));

void best_first_search
  _ARGS((CHUNKS_RECORD *chunks_record,
  A_CHOICE *best_choice,
  A_CHOICE *raw_choice,
  STATE *state,
  STATE*					best_state,
  inT32					pass));

CHOICES_LIST rebuild_current_state();

void write_segmentation
  _ARGS((char *correct,
    CHUNKS_RECORD *chunks_record,
  SEARCH_RECORD  *the_search));

int chunks_width
  _ARGS((WIDTH_RECORD *width_record,
  int start_chunk,
  int last_chunk));

void delete_search
  _ARGS((SEARCH_RECORD *the_search));

CHOICES_LIST evaluate_chunks
  _ARGS((CHUNKS_RECORD *chunks_record,
  SEARCH_STATE search_state,
  STATE*					this_state,
  STATE*					best_state,
  inT32					pass));

inT16 evaluate_state
  _ARGS((CHUNKS_RECORD *chunks_record,
  SEARCH_RECORD *the_search,
  STATE*					best_state,
  inT32					pass));

void expand_node
  _ARGS((CHUNKS_RECORD *chunks_record,
  SEARCH_RECORD *the_search));

SEARCH_RECORD *new_search
  _ARGS((CHUNKS_RECORD *chunks_record,
  int num_joints,
  A_CHOICE *best_choice,
  A_CHOICE *raw_choice,
  STATE *state));

STATE *pop_queue
  _ARGS((HEAP *queue));

void push_queue
  _ARGS((HEAP *queue,
  STATE *state,
  FLOAT32 priority));

void replace_char_widths
  _ARGS((CHUNKS_RECORD *chunks_record,
  SEARCH_STATE state));
#undef _ARGS
*/
#endif
