Loading...
Searching...
No Matches
wfst_aux.cc
/*************************************************************************/
/* */
/* Centre for Speech Technology Research */
/* University of Edinburgh, UK */
/* Copyright (c) 1997 */
/* 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 : November 1997 */
/*-----------------------------------------------------------------------*/
/* */
/* internal classes, methods and function used in minimization and */
/* determinization of WFST. */
/* */
/*=======================================================================*/
#include <iostream>
#include "EST_WFST.h"
#include "wfst_aux.h"
wfst_marks::wfst_marks(int x)
{
// Set up mark table
int i,j;
// Triangular matrix
p_x = x;
p_mark_table = new char *[x];
for (i=0; i < x; i++)
{
p_mark_table[i] = new char[i+1];
for (j=0; j < i+1; j++)
p_mark_table[i][j] = '?';
}
}
wfst_marks::~wfst_marks()
{
int i;
for (i=0; i < p_x; i++)
delete [] p_mark_table[i];
delete [] p_mark_table;
p_mark_table = 0;
}
void wfst_marks::find_state_map(EST_IVector &state_map,int &num_new_states)
{
// Find the mapping from old state names to new
int i,j,new_name;
state_map.resize(p_x);
for (i=0,new_name=0; i < p_x; i++)
{
state_map[i] = -1;
for (j=0; j < i; j++)
if (!distinguished(j,i))
{
state_map[i] = state_map[j];
break;
}
if (state_map[i] == -1)
state_map[i] = new_name++;
}
num_new_states = new_name;
}
void add_assumption(int y,int z,wfst_assumes &assumptions)
{
// Add a binding of y to z, and z to y to assumptions
EST_Litem *p;
int y_ok = FALSE;
int z_ok = FALSE;
for (p=assumptions.list.head(); p != 0; p=p->next())
{
if (assumptions.list(p).k == y)
{
assumptions.list(p).v.append(z);
y_ok = TRUE;
}
if (assumptions.list(p).k == z)
{
assumptions.list(p).v.append(y);
z_ok = TRUE;
}
if (z_ok && y_ok)
break;
}
if (!z_ok)
{
EST_IList b;
b.append(y);
assumptions.add_item(z,b);
}
if (!y_ok)
{
EST_IList b;
b.append(z);
assumptions.add_item(y,b);
}
}
int equivalent_to(int y,int z,wfst_assumes &assumptions)
{
// true if y == z or z is assumed to be equivalent to y
EST_Litem *p,*q;
if (y==z)
return TRUE;
else
{
for (p=assumptions.list.head(); p != 0; p=p->next())
{
if (assumptions.list(p).k == y)
{
EST_IList &b = assumptions.list(p).v;
for (q=b.head(); q != 0; q=q->next())
if (z == b(q))
return TRUE;
}
if (assumptions.list(p).k == z)
{
EST_IList &b = assumptions.list(p).v;
for (q=b.head(); q != 0; q=q->next())
if (y == b(q))
return TRUE;
}
}
return FALSE;
}
}
void mark_undistinguished(wfst_marks &marks,wfst_assumes &assumptions)
{
EST_Litem *p, *q;
for (p=assumptions.list.head(); p != 0; p=p->next())
{
int x = assumptions.list(p).k;
EST_IList &b = assumptions.list(p).v;
for (q=b.head(); q != 0; q=q->next())
marks.undistinguish(x,b(q));
}
}
VAL_REGISTER_CLASS(wfst,EST_WFST)
EST_TKVL::add_item
int add_item(const K &rkey, const V &rval, int no_search=0)
add key-val pair to list
Definition EST_TKVL.cc:248
EST_TKVL::list
EST_TList< EST_TKVI< K, V > > list
Linked list of key-val pairs. Don't use this as it will be made private in the future.
Definition EST_TKVL.h:93
EST_TList::append
void append(const T &item)
add item onto end of list
Definition EST_TList.h:191
EST_TSimpleVector::resize
void resize(int n, int set=1)
resize vector
Definition EST_TSimpleVector.cc:70
EST_WFST
Definition EST_WFST.h:150
wfst_marks
Definition wfst_aux.h:45