www.pudn.com > geosteiner-3.1.zip > efst.h


/***********************************************************************

	File:	efst.h
	Rev:	b-2
	Date:	02/28/2001

	Copyright (c) 1998, 2001 by Pawel Winter, Martin Zachariasen
				    & David M. Warme

************************************************************************

	Declarations for the Euclidean FST generator.

************************************************************************

	Modification Log:

	a-1:	12/11/98	martinz
		: Created.  Derived from Pawel and Martin's C++ program
			    using Warme's infrastructure.
	b-1:	01/22/00	martinz
		: Dynamic allocation of eq-point array using doubling.
		:  (-e option is now the INITIAL number of eq-points
		:  per terminal.)
		: Added epsilon variable for floating point comparisons.
		: Added mean of points.  Translating instance so mean
		:  is at origin maximizes eq-point precision.
		: Added bsd parm to upper bound heuristic.
		: Added new greedy heuristic.
	b-2:	02/28/2001	warme
		: Use GMP, if available, to compute eq-points and
		:  EFST lengths precisely.

************************************************************************/

#ifndef EFST_H
#define EFST_H

#include "bsd.h"
#include "config.h"
#include "egmp.h"
#include "steiner.h"

/*
 * A structure to keep track of one EFST.  They are kept in a hash table
 * so that we can rapidly identify duplicates.	We also keep them all in
 * one big list, which is doubly-linked so that we can rapidly delete a
 * duplicate that is suboptimal.
 */

struct elist {
	struct elist *		forw;	/* Next EFST in saved list */
	struct elist *		back;	/* Previous EFST in saved list */
	struct elist *		next;	/* Next EFST in hash table */
	int			size;	/* Number of terminals */
	struct full_set *	fst;	/* The actual FST */
};

/*
 * Type used to store the terminal lists.
 */

typedef	int16u			eterm_t;


/*
 * The current state for a single equilateral point.
 */

struct eqp_t {
	struct point	E;	/* Coordinates of equilateral point */
  	struct point 	DV;     /* Displacement vector (relative to terminal) */
	struct point	LP;	/* Left endpoint of Steiner arc */
	struct point	RP;	/* Right endpoint of Steiner arc */
	struct eqp_t *	L;	/* Pointer to left eq-point */
	struct eqp_t *	R;	/* Pointer to right eq-point */
	int		S;	/* Number of terminals used in construction */
	dist_t		UB;	/* Upper bound on tree spanning Steiner */
				/* arc and terminals */
	dist_t		BS;	/* Shortest BSD between terminals */
	struct point	DC;	/* Center of eq-point circle */
	dist_t		DR;	/* Radius of eq-point circle */
	dist_t		DR2;	/* Squared radius of eq-point circle */
	eterm_t *	Z;	/* Pointer to list of terminals */
	int		SMINX;	/* Range of eq-point recangle in */
	int		SMAXX;	/* square data structure */
	int		SMINY;
	int		SMAXY;
	bool		CHOSEN;
};


/*
 * Equilateral point rectangle data structure
 */

struct eqp_square_t {
	struct eqp_t ** eqp;	/* Pointer to array of eq-points */
	int		n;	/* Number of eq-points in array */
};

/*
 * Global information used by the EFST generator.
 */

struct einfo {
	struct pset *	pts;		/* The set of terminals */
	int *		x_order;	/* Order of terminals by X, Y, index */
					/* directions (plus 3 wrap dirs) */
	dist_t		mst_length;	/* Length of the MST */
	dist_t		max_mst_edge;	/* Length of longest MST edge */
	struct bsd *	bsd;		/* Bottleneck Steiner distance info */
	dist_t		eps;		/* Relative epsilon used for comparisons */
	struct point	mean;		/* Mean point of all terminals */
	struct eqp_t *	eqp;		/* Array of equilateral points */
	int		eqp_size;	/* Current size of eq-point array */
	int *		size_start;	/* Starting index of eq-points of */
					/* given size */
	int		zalloc_size;	/* Current maximum number of */
					/* terminal lists */
	eterm_t *	eqpZ;		/* List of terminals for each eq-point */
	int		eqpZ_size;	/* Current size of terminals list */
	eterm_t *	eqpZ_curr;	/* Current allocation pointer */
	bool *		MEMB;		/* For checking eq-point overlap */

	/* Variables used while generating eq-points */
	dist_t		dxi, dyi, dxj, dyj;
	struct pset *	termlist;

	/* Variables used for storing eq-point rectangles */
	dist_t		eqp_square_size;	/* Size of squares */
	struct eqp_square_t **	eqp_squares;	/* Eq-point squares */
	dist_t		minx, maxx, miny, maxy; /* Terminal coordinate range */
	int		srangex, srangey;	/* Range of squares */

	int		fsts_checked;	/* Num FSTs sent to screening tests */
	bool *		term_check;	/* To compare FST terminal sets */

	int		num_term_masks; /* Size of terminal mask in each FST */

	struct elist ** hash;		/* FST hash table */
	struct elist	list;		/* Head of circular EFST list */

	int		ntrees;		/* Final number of FSTs */
	struct full_set * full_sets;	/* Final list of FSTs */
	struct full_set ** hookp;	/* For adding to end of FST list */

#ifdef HAVE_GMP
	struct qr3_point cur_eqp;	/* Exact pos of current eq-point */
#endif
};

/*
 * Function Prototypes.
 */

extern dist_t		smith_lee_liebman (struct pset *, struct bsd *);
extern dist_t		greedy_heuristic  (struct pset *, struct bsd *);

#endif