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