speech-tools/ling_class/item_feats.cc
2015-09-19 10:52:26 +02:00

150 lines
5.5 KiB
C++

/*************************************************************************/
/* */
/* 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 : June 1998 */
/*-----------------------------------------------------------------------*/
/* Support for feature functions for EST_Items */
/* */
/*=======================================================================*/
#include <cstdlib>
#include <cstdio>
#include <iostream>
#include <fstream>
#include "EST_THash.h"
#include "ling_class/EST_Item.h"
#include "ling_class/EST_Item_Content.h"
#include "ling_class/EST_Relation.h"
#include "ling_class/EST_FeatureFunctionPackage.h"
#include "EST_FeatureFunctionContext.h"
const char *error_name(EST_Item_featfunc f)
{
(void)f;
return "<<EST_Item_featfunc>>";
}
const EST_Item_featfunc get_featfunc(const EST_String &name,int must)
{
const EST_Item_featfunc f = EST_FeatureFunctionContext::global->get_featfunc(name, must);
return f;
}
void register_featfunc(const EST_String &name, const EST_Item_featfunc func)
{
if (EST_FeatureFunctionContext::global->get_featfunc("standard", name,0) != 0)
cerr << "item featfunc \"" << name <<
"\" redefined definition" << endl;
EST_FeatureFunctionPackage *package = EST_FeatureFunctionContext::global->get_package("standard");
package->register_func(name,func);
}
EST_String get_featname(const EST_Item_featfunc func)
{
int found;
EST_String name = EST_FeatureFunctionContext::global->get_featfunc_name(func, found);
if (!found)
EST_error("featfunc %p has no name", func);
return name;
}
void EST_register_feature_function_package(const char *name,
void (*init_fn)(EST_FeatureFunctionPackage &p))
{
EST_FeatureFunctionPackage *package = new EST_FeatureFunctionPackage(name, 20);
EST_FeatureFunctionContext::global->add_package(package);
(*init_fn)(*package);
}
/* EST_Item_featfuncs may be used in EST_Vals */
/* EST_Item_featfuncs aren't a class so we can't use the standard */
/* registration procedure and have to explicitly write it */
val_type val_type_featfunc = "featfunc";
const EST_Item_featfunc featfunc(const EST_Val &v)
{
if (v.type() == val_type_featfunc)
return (const EST_Item_featfunc)v.internal_ptr();
else
EST_error("val not of type val_type_featfunc");
return NULL;
}
void val_delete_featfunc(void *v)
{ /* Function pointers can't be freed */
(void)v;
}
void val_copy_featfunc(void *v1,void *v2)
{
v1 = v2;
}
EST_Val est_val(const EST_Item_featfunc f)
{
return EST_Val(val_type_featfunc,(void *)f,val_delete_featfunc);
}
#if 0
/* An example only */
EST_Val start_time(EST_Item *s)
{
EST_Relation *r = s->relation();
if (s == 0)
return 0.0;
else if ((r == 0) || (r->f("timing-style") != "segment"))
return s->f("start");
else
{
// Its to be derived.
EST_String asrel = r->f("start-from");
EST_Item *fl = s->first_leaf();
if ((asrel == "0") || (asrel == s->relation_name()))
{
if (prev(s))
return prev(fl)->f("end");
else
return 0.0;
}
else
return start_time(fl->as_relation(asrel));
}
}
#endif