1 #include "ltfat.h"
2 #include "ltfat/types.h"
3 #include "ltfat/macros.h"
4 #include "dgtrealmp_private.h"
5
6 int
ltfat_dgtmp_params_defaults(ltfat_dgtmp_params * params)7 ltfat_dgtmp_params_defaults(ltfat_dgtmp_params* params)
8 {
9 int status = LTFATERR_SUCCESS;
10 CHECKNULL(params);
11 /* params->hint = ltfat_dgtrealmp_allmods; */
12 params->alg = ltfat_dgtmp_alg_mp;
13 params->errtoldb = -40.0;
14 params->kernrelthr = 1e-4;
15 params->verbose = 0;
16 params->maxatoms = 0;
17 params->maxit = 0;
18 params->iterstep = 0;
19 params->treelevels = 10;
20 params->cycles = 1;
21 params->atprodreltoldb = -80.0;
22 params->ptype = LTFAT_TIMEINV;
23 error:
24 return status;
25 }
26
27 LTFAT_API ltfat_dgtmp_params*
ltfat_dgtmp_params_allocdef()28 ltfat_dgtmp_params_allocdef()
29 {
30 ltfat_dgtmp_params* params;
31 int status = LTFATERR_SUCCESS;
32 CHECKMEM( params = LTFAT_NEW(ltfat_dgtmp_params));
33
34 ltfat_dgtmp_params_defaults(params);
35
36 error:
37 return params;
38 }
39
40 LTFAT_API int
ltfat_dgtmp_params_free(ltfat_dgtmp_params * params)41 ltfat_dgtmp_params_free(ltfat_dgtmp_params* params)
42 {
43 int status = LTFATERR_SUCCESS;
44 CHECKNULL(params);
45 ltfat_free(params);
46 error:
47 return status;
48 }
49
50 LTFAT_API int
ltfat_dgtmp_setpar_atprodreltoldb(ltfat_dgtmp_params * params,double atprodreltoldb)51 ltfat_dgtmp_setpar_atprodreltoldb(ltfat_dgtmp_params* params, double atprodreltoldb)
52 {
53 int status = LTFATERR_SUCCESS;
54 CHECKNULL(params);
55 CHECK(LTFATERR_NOTPOSARG, atprodreltoldb <= 0,
56 "Nonpositive number is expected (passed %d)", atprodreltoldb);
57
58 params->atprodreltoldb = atprodreltoldb;
59 error:
60 return status;
61 }
62
63 LTFAT_API int
ltfat_dgtmp_setpar_phaseconv(ltfat_dgtmp_params * params,ltfat_phaseconvention pconv)64 ltfat_dgtmp_setpar_phaseconv(
65 ltfat_dgtmp_params* params, ltfat_phaseconvention pconv)
66 {
67 int status = LTFATERR_SUCCESS;
68 CHECKNULL(params);
69 CHECK(LTFATERR_BADARG, ltfat_phaseconvention_is_valid(pconv),
70 "Invalid phase conv. passed (passed %d)", pconv);
71
72 params->ptype = pconv;
73 error:
74 return status;
75 }
76
77 LTFAT_API int
ltfat_dgtmp_setpar_pedanticsearch(ltfat_dgtmp_params * params,int do_pedanticsearch)78 ltfat_dgtmp_setpar_pedanticsearch(
79 ltfat_dgtmp_params* params, int do_pedanticsearch)
80 {
81 int status = LTFATERR_SUCCESS;
82 CHECKNULL(params);
83
84 params->do_pedantic = do_pedanticsearch;
85 error:
86 return status;
87 }
88
89 LTFAT_API int
ltfat_dgtmp_setpar_alg(ltfat_dgtmp_params * params,ltfat_dgtmp_alg alg)90 ltfat_dgtmp_setpar_alg(
91 ltfat_dgtmp_params* params, ltfat_dgtmp_alg alg)
92 {
93 int status = LTFATERR_SUCCESS;
94 CHECKNULL(params);
95 CHECK(LTFATERR_BADARG, ltfat_dgtmp_alg_isvalid(alg),
96 "Invalid hint passed (passed %d)", alg);
97
98 params->alg = alg;
99 error:
100 return status;
101 }
102
103 LTFAT_API int
ltfat_dgtmp_setpar_maxatoms(ltfat_dgtmp_params * params,size_t maxatoms)104 ltfat_dgtmp_setpar_maxatoms(
105 ltfat_dgtmp_params* params, size_t maxatoms)
106 {
107 int status = LTFATERR_SUCCESS;
108 CHECKNULL(params);
109
110 CHECK(LTFATERR_NOTPOSARG, maxatoms > 0, "maxatoms must be greater than 0");
111 params->maxatoms = maxatoms;
112
113 if (params->maxit == 0)
114 params->maxit = 2 * maxatoms;
115 error:
116 return status;
117 }
118
119 LTFAT_API int
ltfat_dgtmp_setpar_maxit(ltfat_dgtmp_params * params,size_t maxit)120 ltfat_dgtmp_setpar_maxit(
121 ltfat_dgtmp_params* params, size_t maxit)
122 {
123 int status = LTFATERR_SUCCESS;
124 CHECKNULL(params);
125
126 CHECK(LTFATERR_NOTPOSARG, maxit > 0, "maxatoms must be greater than 0");
127 params->maxit = maxit;
128
129 error:
130 return status;
131 }
132
133 LTFAT_API int
ltfat_dgtmp_setpar_cycles(ltfat_dgtmp_params * params,size_t cycles)134 ltfat_dgtmp_setpar_cycles(
135 ltfat_dgtmp_params* params, size_t cycles)
136 {
137 int status = LTFATERR_SUCCESS;
138 CHECKNULL(params);
139
140 CHECK(LTFATERR_NOTPOSARG, cycles > 0, "maxatoms must be greater than 0");
141 params->cycles = cycles;
142
143 error:
144 return status;
145 }
146
147 LTFAT_API int
ltfat_dgtmp_setpar_errtoldb(ltfat_dgtmp_params * params,double errtoldb)148 ltfat_dgtmp_setpar_errtoldb(
149 ltfat_dgtmp_params* params, double errtoldb)
150 {
151 int status = LTFATERR_SUCCESS;
152 CHECKNULL(params);
153 CHECK(LTFATERR_BADARG, errtoldb <= 0, "errtoldb must be lower than 0");
154 params->errtoldb = errtoldb;
155
156 error:
157 return status;
158 }
159
160 LTFAT_API int
ltfat_dgtmp_setpar_snrdb(ltfat_dgtmp_params * params,double snrdb)161 ltfat_dgtmp_setpar_snrdb(
162 ltfat_dgtmp_params* params, double snrdb)
163 {
164 int status = LTFATERR_SUCCESS;
165 CHECKNULL(params);
166 CHECK(LTFATERR_BADARG, snrdb >= 0, "snrdb must be higher than 0");
167 params->errtoldb = -snrdb;
168 error:
169 return status;
170 }
171
172 LTFAT_API int
ltfat_dgtmp_setpar_iterstep(ltfat_dgtmp_params * params,size_t iterstep)173 ltfat_dgtmp_setpar_iterstep(
174 ltfat_dgtmp_params* params, size_t iterstep)
175 {
176 int status = LTFATERR_SUCCESS;
177 CHECKNULL(params);
178 CHECK(LTFATERR_NOTPOSARG, iterstep > 0, "iterstep must be greater than 0");
179 params->iterstep = iterstep;
180 error:
181 return status;
182 }
183
184 LTFAT_API int
ltfat_dgtmp_setpar_kernrelthr(ltfat_dgtmp_params * params,double thr)185 ltfat_dgtmp_setpar_kernrelthr(
186 ltfat_dgtmp_params* params, double thr)
187 {
188 int status = LTFATERR_SUCCESS;
189 CHECKNULL(params);
190 CHECK(LTFATERR_BADARG, thr <= 1 && thr >= 0,
191 "Relative threshold must be in range [0-1] (passed %f)."
192 " Using previously set threshold %f", thr, params->kernrelthr);
193 params->kernrelthr = thr;
194 error:
195 return status;
196 }
197
198 /* int */
199 /* ltfat_dgtrealmp_hint_isvalid(ltfat_dgtrealmp_hint in) */
200 /* { */
201 /* int isvalid = 0; */
202 /* */
203 /* switch (in) */
204 /* { */
205 /* case ltfat_dgtrealmp_auto: */
206 /* case ltfat_dgtrealmp_singlemod: */
207 /* case ltfat_dgtrealmp_allmods: */
208 /* isvalid = 1; */
209 /* } */
210 /* */
211 /* return isvalid; */
212 /* } */
213
214 int
ltfat_dgtmp_alg_isvalid(ltfat_dgtmp_alg in)215 ltfat_dgtmp_alg_isvalid(ltfat_dgtmp_alg in)
216 {
217 int isvalid = 0;
218
219 switch (in)
220 {
221 case ltfat_dgtmp_alg_mp:
222 case ltfat_dgtmp_alg_locomp:
223 case ltfat_dgtmp_alg_loccyclicmp:
224 case ltfat_dgtmp_alg_locselfprojmp:
225 isvalid = 1;
226 }
227
228 return isvalid;
229 }
230