1/*---------------------------------------------------------------------------*
2 *  catrans.c  *
3 *                                                                           *
4 *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
5 *                                                                           *
6 *  Licensed under the Apache License, Version 2.0 (the 'License');          *
7 *  you may not use this file except in compliance with the License.         *
8 *                                                                           *
9 *  You may obtain a copy of the License at                                  *
10 *      http://www.apache.org/licenses/LICENSE-2.0                           *
11 *                                                                           *
12 *  Unless required by applicable law or agreed to in writing, software      *
13 *  distributed under the License is distributed on an 'AS IS' BASIS,        *
14 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
15 *  See the License for the specific language governing permissions and      *
16 *  limitations under the License.                                           *
17 *                                                                           *
18 *---------------------------------------------------------------------------*/
19
20
21static const char pat_tran[] = "$Id: catrans.c,v 1.3.10.2 2007/08/31 17:44:51 dahan Exp $";
22
23#include <stdlib.h>
24#include <string.h>
25#include <stdio.h>
26
27#ifdef unix
28#include <unistd.h>
29#endif
30#include <assert.h>
31
32#include"simapi.h"
33
34CA_Transform *CA_AllocateTransform(void)
35{
36  CA_Transform *hTransform = NULL;
37  TRY_CA_EXCEPT
38
39
40  hTransform = (CA_Transform *) VAR_ALLOCATE_CLR(1, sizeof(CA_Transform), "ca.hTransform");
41  hTransform->is_loaded = False;
42  hTransform->is_setup = False;
43
44  return (hTransform);
45
46  BEG_CATCH_CA_EXCEPT
47  END_CATCH_CA_EXCEPT(hTransform)
48}
49
50
51void CA_FreeTransform(CA_Transform *hTransform)
52{
53  TRY_CA_EXCEPT
54
55  ASSERT(hTransform);
56  VAR_FREE((char *) hTransform, "hTransform");
57  return;
58
59  BEG_CATCH_CA_EXCEPT
60  END_CATCH_CA_EXCEPT(hTransform)
61}
62
63
64int CA_LoadTransform(CA_Transform *hTransform, int dimen)
65{
66  TRY_CA_EXCEPT
67
68  ASSERT(hTransform);
69  ASSERT(dimen > 0);
70
71  if (hTransform->is_loaded == True)
72    SERVICE_ERROR(PATTERN_ALREADY_LOADED);
73
74  hTransform->dim = dimen;
75
76  hTransform->imelda_acc.between = create_accumulate_matrix(hTransform->dim);
77  hTransform->imelda_acc.bmean = (accdata *) VAR_ALLOCATE(hTransform->dim,
78                                 sizeof(accdata), "ca.hTransform->imelda_acc.bmean");
79  hTransform->imelda_acc.within = create_accumulate_matrix(dimen);
80  hTransform->imelda_acc.wmean = (accdata *) VAR_ALLOCATE(hTransform->dim,
81                                 sizeof(accdata), "ca.hTransform->imelda_acc.wmean");
82  hTransform->mllr_acc.between = create_accumulate_matrix(hTransform->dim + 1);
83  hTransform->mllr_acc.within = create_accumulate_matrix(hTransform->dim + 1);
84
85  hTransform->is_loaded = True;
86
87  return (True);
88
89  BEG_CATCH_CA_EXCEPT
90  END_CATCH_CA_EXCEPT(hTransform)
91}
92
93
94void CA_ConfigureTransform(CA_Transform *hTransform, int do_mllr, int do_imelda)
95{
96  TRY_CA_EXCEPT
97
98  ASSERT(hTransform);
99
100  hTransform->do_mllr = do_mllr;
101  hTransform->do_imelda = do_imelda;
102
103  return;
104
105  BEG_CATCH_CA_EXCEPT
106  END_CATCH_CA_EXCEPT(hTransform)
107}
108
109
110void CA_UnloadTransform(CA_Transform *hTransform)
111{
112  TRY_CA_EXCEPT
113  ASSERT(hTransform);
114  if (hTransform->is_loaded == False)
115    SERVICE_ERROR(PATTERN_NOT_LOADED);
116
117  delete_accumulate_matrix(hTransform->imelda_acc.between, hTransform->dim);
118  delete_accumulate_matrix(hTransform->imelda_acc.within, hTransform->dim);
119  delete_accumulate_matrix(hTransform->mllr_acc.between, hTransform->dim + 1);
120  delete_accumulate_matrix(hTransform->mllr_acc.within, hTransform->dim + 1);
121  VAR_FREE(hTransform->imelda_acc.bmean, "hTransform->imelda_acc.bmean");
122  VAR_FREE(hTransform->imelda_acc.wmean, "hTransform->imelda_acc.wmean");
123
124  hTransform->is_loaded = False;
125
126  return;
127
128  BEG_CATCH_CA_EXCEPT
129  END_CATCH_CA_EXCEPT(hTransform)
130}
131
132
133void CA_ClearTransform(CA_Transform *hTransform)
134{
135  TRY_CA_EXCEPT
136  int ii, jj;
137
138  if (hTransform->is_loaded == False)
139    SERVICE_ERROR(PATTERN_NOT_LOADED);
140
141  ASSERT(hTransform->imelda_acc.within);
142  ASSERT(hTransform->imelda_acc.between);
143  ASSERT(hTransform->imelda_acc.wmean);
144  ASSERT(hTransform->imelda_acc.bmean);
145  ASSERT(hTransform->mllr_acc.within);
146  ASSERT(hTransform->mllr_acc.between);
147
148  for (ii = 0; ii <= hTransform->dim; ii++)
149  {
150    for (jj = 0; jj <= hTransform->dim; jj++)
151    {
152      hTransform->mllr_acc.between[ii][jj] = 0;
153      hTransform->mllr_acc.within[ii][jj] = 0;
154    }
155  }
156
157  for (ii = 0; ii < hTransform->dim; ii++)
158  {
159    hTransform->imelda_acc.wmean[ii] = 0;
160    hTransform->imelda_acc.bmean[ii] = 0;
161    for (jj = 0; jj < hTransform->dim; jj++)
162    {
163      hTransform->imelda_acc.between[ii][jj] = 0;
164      hTransform->imelda_acc.within[ii][jj] = 0;
165    }
166  }
167  hTransform->imelda_acc.num = 0;
168  return;
169
170  BEG_CATCH_CA_EXCEPT
171  END_CATCH_CA_EXCEPT(hTransform)
172}
173
174
175void CA_InheritAccumulates(CA_Transform *hTransform, CA_Pattern *hPattern)
176{
177  TRY_CA_EXCEPT
178  int ii, jj;
179
180  ASSERT(hPattern);
181  if (hPattern->is_loaded == False)
182    SERVICE_ERROR(PATTERN_NOT_LOADED);
183  ASSERT(hTransform);
184  if (hTransform->is_loaded == False)
185    SERVICE_ERROR(PATTERN_NOT_LOADED);
186
187  ASSERT(hTransform->dim == hPattern->data.dim);
188
189  if (hTransform->do_mllr)
190  {
191
192    ASSERT(hPattern->true_accumulates);
193    ASSERT(hPattern->data.do_mllr);
194    ASSERT(hPattern->data.mllr_acc.between);
195    ASSERT(hTransform->mllr_acc.between);
196
197    for (ii = 0; ii <= hTransform->dim; ii++)
198      for (jj = 0; jj <= hTransform->dim; jj++)
199      {
200
201        hTransform->mllr_acc.between[ii][jj] +=
202          hPattern->data.mllr_acc.between[ii][jj];
203        hTransform->mllr_acc.within[ii][jj] +=
204          hPattern->data.mllr_acc.within[ii][jj];
205
206      }
207
208    log_report("\nCA_InheritAccumulates MLLR inheriting %f frames (total now %f)\n\n", hPattern->data.mllr_acc.within[hTransform->dim][hTransform->dim], hTransform->mllr_acc.within[hTransform->dim][hTransform->dim]);
209  }
210
211  if (hTransform->do_imelda)
212  {
213
214    ASSERT(hPattern->data.do_imelda);
215    ASSERT(hPattern->data.mllr_acc.between);
216    ASSERT(hTransform->mllr_acc.between);
217
218    for (ii = 0; ii < hTransform->dim; ii++)
219      for (jj = 0; jj < hTransform->dim; jj++)
220      {
221
222        hTransform->imelda_acc.between[ii][jj] +=
223          hPattern->data.imelda_acc.between[ii][jj];
224        hTransform->imelda_acc.within[ii][jj] +=
225          hPattern->data.imelda_acc.within[ii][jj];
226      }
227
228    for (ii = 0; ii < hTransform->dim; ii++)
229    {
230
231      hTransform->imelda_acc.bmean[ii] +=
232        hPattern->data.imelda_acc.bmean[ii];
233      hTransform->imelda_acc.wmean[ii] +=
234        hPattern->data.imelda_acc.wmean[ii];
235    }
236
237    hTransform->imelda_acc.num += hPattern->data.imelda_acc.num;
238
239    log_report("\nCA_InheritAccumulates Imelda inheriting %d frames (total now %d)\n\n", hPattern->data.imelda_acc.num, hTransform->imelda_acc.num);
240  }
241
242  return;
243
244  BEG_CATCH_CA_EXCEPT
245  END_CATCH_CA_EXCEPT(hPattern)
246}
247
248
249void CA_LoadTransformAccumulates(CA_Pattern *hPattern,
250                                 CA_Transform *hTransform)
251{
252  TRY_CA_EXCEPT
253  int ii, jj;
254
255  ASSERT(hPattern);
256  if (hPattern->is_loaded == False)
257    SERVICE_ERROR(PATTERN_NOT_LOADED);
258  ASSERT(hTransform);
259  if (hTransform->is_loaded == False)
260    SERVICE_ERROR(PATTERN_NOT_LOADED);
261
262  ASSERT(hTransform->dim == hPattern->data.dim);
263
264  if (hTransform->do_mllr)
265  {
266
267    ASSERT(hPattern->data.do_mllr);
268    ASSERT(hPattern->data.mllr_acc.between);
269    ASSERT(hTransform->mllr_acc.between);
270
271    for (ii = 0; ii <= hTransform->dim; ii++)
272      for (jj = 0; jj <= hTransform->dim; jj++)
273      {
274
275        hPattern->data.mllr_acc.between[ii][jj] =
276          hTransform->mllr_acc.between[ii][jj];
277        hPattern->data.mllr_acc.within[ii][jj] =
278          hTransform->mllr_acc.within[ii][jj];
279      }
280  }
281
282  if (hTransform->do_imelda)
283  {
284
285    ASSERT(hPattern->data.do_imelda);
286    ASSERT(hPattern->data.mllr_acc.between);
287    ASSERT(hTransform->mllr_acc.between);
288
289    for (ii = 0; ii < hTransform->dim; ii++)
290      for (jj = 0; jj < hTransform->dim; jj++)
291      {
292
293        hPattern->data.imelda_acc.between[ii][jj] =
294          hTransform->imelda_acc.between[ii][jj];
295        hPattern->data.imelda_acc.within[ii][jj] =
296          hTransform->imelda_acc.within[ii][jj];
297      }
298
299    for (ii = 0; ii < hTransform->dim; ii++)
300    {
301
302      hPattern->data.imelda_acc.bmean[ii] =
303        hTransform->imelda_acc.bmean[ii];
304      hPattern->data.imelda_acc.wmean[ii] =
305        hTransform->imelda_acc.wmean[ii];
306    }
307
308    hPattern->data.imelda_acc.num = hTransform->imelda_acc.num;
309
310  }
311
312  return;
313
314  BEG_CATCH_CA_EXCEPT
315  END_CATCH_CA_EXCEPT(hPattern)
316}
317
318
319