/*************************************************************************/
/* */
/* Centre for Speech Technology Research */
/* University of Edinburgh, UK */
/* Copyright (c) 1998 */
/* All Rights Reserved. */
/* Permission is hereby granted, free of charge, to use and distribute */
/* this software and its documentation without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of this work, and to */
/* permit persons to whom this work is furnished to do so, subject to */
/* the following conditions: */
/* 1. The code must retain the above copyright notice, this list of */
/* conditions and the following disclaimer. */
/* 2. Any modifications must be clearly marked as such. */
/* 3. Original authors' names are not deleted. */
/* 4. The authors' names are not used to endorse or promote products */
/* derived from this software without specific prior written */
/* permission. */
/* THE UNIVERSITY OF EDINBURGH AND THE CONTRIBUTORS TO THIS WORK */
/* DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING */
/* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT */
/* SHALL THE UNIVERSITY OF EDINBURGH NOR THE CONTRIBUTORS BE LIABLE */
/* FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES */
/* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN */
/* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, */
/* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF */
/* THIS SOFTWARE. */
/* */
/*************************************************************************/
/* Author : Alan W Black */
/* Date : February 1998 */
/* --------------------------------------------------------------------- */
/* another architecture */
/* */
/*************************************************************************/
#ifndef __EST_RELATION_H__
#define __EST_RELATION_H__
#include "EST_String.h"
#include "EST_TList.h"
#include "EST_TKVL.h"
#include "EST_THash.h"
#include "EST_Val.h"
#include "EST_types.h"
#include "EST_Token.h"
#include "EST_Features.h"
#include "ling_class/EST_Item.h"
class EST_Utterance;
class EST_Relation_Iterator;
/** Relations are a container class for EST_Items. Three types of
relation structure are supported:
Linear listsTreesMulti-linear structures as used
in autosegmental phonology etc
*/
class EST_Relation
{
EST_String p_name;
EST_Utterance *p_utt;
EST_Item *p_head;
EST_Item *p_tail; // less meaningful in a tree
EST_Item *get_item_from_name(EST_THash &inames,int name);
EST_Item *get_item_from_name(EST_TVector< EST_Item * > &inames,int name);
EST_write_status save_items(EST_Item *item,
ostream &outf,
EST_TKVL &contentnames,
EST_TKVL &itemnames,
int &node_count) const;
static void node_tidy_up_val(int &k, EST_Val &v);
static void node_tidy_up(int &k, EST_Item *node);
EST_read_status load_items(EST_TokenStream &ts,
const EST_THash &contents);
EST_read_status load_items(EST_TokenStream &ts,
const EST_TVector < EST_Item_Content * > &contents
);
void copy(const EST_Relation &r);
public:
/** default constructor */
EST_Relation();
/** Constructor which sets name of relation */
EST_Relation(const EST_String &name);
/** Constructor which copies relation r */
EST_Relation(const EST_Relation &r) { copy(r); }
/** default destructor */
~EST_Relation();
/** Features which belong to the relation rather than its items*/
EST_Features f;
/** Evaluate the relation's feature functions */
//void evaluate_features();
/** Evaluate the feature functions of all the items in the relation */
void evaluate_item_features();
/** Clear the relation of items */
void clear();
/** Return the EST_Utterance
to which this relation belongs */
EST_Utterance *utt(void) { return p_utt; }
/** Set the EST_Utterance
to which this relation belongs */
void set_utt(EST_Utterance *u) { p_utt = u; }
/** Return the name of the relation */
const EST_String &name() const { return (this == 0) ? EST_String::Empty : p_name; }
/** Return the head (first) item of the relation */
EST_Item *head() const {return (this == 0) ? 0 : p_head;}
/** Return the root item of the relation */
EST_Item *root() const {return head();}
/** Return the tail (last) item of the relation */
EST_Item *tail() const {return (this == 0) ? 0 : p_tail;}
// This have been replaced by Relation_Tree functions
EST_Item *first() const { return head(); }
EST_Item *first_leaf() const;
EST_Item *last() const { return tail(); }
EST_Item *last_leaf() const;
/** Return the tail (last) item of the relation */
// EST_Item *id(int i);
/** number of items in this relation */
int length() const;
// int num_nodes() const;
// int num_leafs() const;
/** return true if relation does not contain any items */
int empty() const { return p_head == 0; }
/** remove EST_Item item from relation */
void remove_item(EST_Item *item);
/** remove all occurrences of feature
name from relation's items
*/
void remove_item_feature(const EST_String &name);
/** Load relation from file */
EST_read_status load(const EST_String &filename,
const EST_String &type="esps");
/** Load relation from already open tokenstream */
// EST_read_status load(EST_TokenStream &ts,
// const EST_THash &contents);
/** Load relation from already open tokenstream */
EST_read_status load(EST_TokenStream &ts,
const EST_TVector < EST_Item_Content * > &contents
);
/** Load relation from already open tokenstream */
EST_read_status load(const EST_String &filename,
EST_TokenStream &ts,
const EST_String &type);
/** Save relation to file */
EST_write_status save(const EST_String &filename,
bool evaluate_ff = false) const;
/** Save relation to file, evaluating all feature functions before hand */
EST_write_status save(const EST_String &filename,
const EST_String &type,
bool evaluate_ff = false) const;
/** Save relation from already open ostream */
EST_write_status save(ostream &outf,EST_TKVL contents) const;
/** Save relation from already open ostream */
EST_write_status save(ostream &outf,
const EST_String &type,
bool evaluate_ff) const;
/** Iteration */
typedef EST_Relation_Iterator Iterator;
EST_Relation &operator=(const EST_Relation &s);
friend ostream& operator << (ostream &s, const EST_Relation &u);
EST_Item *append(EST_Item *si);
EST_Item *append();
EST_Item *prepend(EST_Item *si);
EST_Item *prepend();
friend class EST_Item;
};
VAL_REGISTER_CLASS_DCLS(relation,EST_Relation)
inline bool operator==(const EST_Relation &a, const EST_Relation &b)
{ return (&a == &b); }
void copy_relation(const EST_Relation &from, EST_Relation &to);
EST_Utterance *get_utt(EST_Item *s);
class EST_Relation_Iterator
{
private:
const EST_Relation &rel;
EST_Item *next;
public:
EST_Relation_Iterator(const EST_Relation &r)
: rel(r), next(NULL) { reset();};
void reset()
{ next=rel.head(); }
bool has_more_elements()
{ return next != NULL; }
EST_Item *next_element();
};
typedef EST_TList EST_RelationList;
#endif