TPCCLIB
Loading...
Searching...
No Matches
par.c
Go to the documentation of this file.
1
4/*****************************************************************************/
5#include "tpcclibConfig.h"
6/*****************************************************************************/
7#include <stdio.h>
8#include <stdlib.h>
9#include <math.h>
10#include <time.h>
11#include <string.h>
12/*****************************************************************************/
13#include "tpcextensions.h"
14#include "tpcmodels.h"
15#include "tpcift.h"
16/*****************************************************************************/
17#include "tpcpar.h"
18/*****************************************************************************/
19
20/*****************************************************************************/
27 PAR *par
28) {
29 if(par==NULL) return;
31 par->tacNr=par->_tacNr=0;
32 par->parNr=par->_parNr=0;
33 par->n=NULL;
34 par->r=NULL;
35 iftInit(&par->h);
36}
37
43 PARR *parr
44) {
45 if(parr==NULL) return;
46 parr->model=0;
47 parr->name[0]='\0';
48 parr->start=parr->end=nan("");
49 parr->fitNr=0;
50 parr->dataNr=0;
51 parr->p=parr->sd=parr->cl1=parr->cl2=NULL;
52 parr->wss=nan("");
53 parr->sw=0;
54}
55
61 PARN *parn
62) {
63 if(parn==NULL) return;
64 parn->name[0]='\0';
65 parn->unit=UNIT_UNKNOWN;
66 parn->lim1=parn->lim2=parn->tol=nan("");
67 parn->sw=0;
68}
69/*****************************************************************************/
70
71/*****************************************************************************/
77 PAR *par
78) {
79 if(par==NULL) return;
80 for(int i=0; i<par->_tacNr; i++) parrFree(par->r+i);
81 free(par->r);
82 free(par->n);
83 iftFree(&par->h);
84 parInit(par);
85}
86
89 PARR *parr
90) {
91 if(parr==NULL) return;
92 free(parr->p);
93 free(parr->sd);
94 free(parr->cl1);
95 free(parr->cl2);
96 parrInit(parr);
97}
98/*****************************************************************************/
99
100/*****************************************************************************/
111 PAR *par,
113 int parNr,
115 int tacNr
116) {
117 if(par==NULL) return TPCERROR_FAIL;
118 /* Delete any previous contents */
119 parFree(par);
120 /* If no memory is requested, then just return */
121 if(parNr<1 && tacNr<1) return TPCERROR_OK;
122 if(parNr<1 || tacNr<1) return TPCERROR_FAIL;
123
124 /* Allocate memory for PARR data */
125 int ret;
126 par->r=(PARR*)malloc(tacNr*sizeof(PARR));
127 if(par->r==NULL) return TPCERROR_OUT_OF_MEMORY;
128 for(int i=0; i<tacNr; i++) {
129 parrInit(&par->r[i]);
130 ret=parrAllocate(par->r+i, parNr); if(ret!=TPCERROR_OK) return ret;
131 }
132 par->_tacNr=tacNr;
133
134 /* Allocate memory for parameter names and units */
135 par->n=(PARN*)malloc(parNr*sizeof(PARN));
136 if(par->n==NULL) return TPCERROR_OUT_OF_MEMORY;
137 for(int i=0; i<parNr; i++) parnInit(&par->n[i]);
138 par->_parNr=parNr;
139
140 return TPCERROR_OK;
141}
142/*****************************************************************************/
143
144/*****************************************************************************/
152 PARR *parr,
154 int parNr
155) {
156 if(parr==NULL) return TPCERROR_FAIL;
157 /* Delete any previous contents */
158 parrFree(parr);
159 /* If no memory is requested, then just return */
160 if(parNr<1) return TPCERROR_OK;
161
162 /* Allocate memory for PARR data */
163 parr->p=malloc(parNr*sizeof(double));
164 parr->sd=malloc(parNr*sizeof(double));
165 parr->cl1=malloc(parNr*sizeof(double));
166 parr->cl2=malloc(parNr*sizeof(double));
167 if(parr->p==NULL || parr->sd==NULL || parr->cl1==NULL || parr->cl2==NULL)
169 /* Initiate values to NaNs */
170 for(int i=0; i<parNr; i++)
171 parr->p[i]=parr->sd[i]=parr->cl1[i]=parr->cl2[i]=nan("");
172
173 return TPCERROR_OK;
174}
175/*****************************************************************************/
176
177/*****************************************************************************/
186 PAR *par,
189 int parNr,
192 int tacNr
193) {
194 if(par==NULL) return TPCERROR_FAIL;
195 if(par->_parNr<1 || par->_tacNr<1) return TPCERROR_FAIL;
196 if(parNr<0 || tacNr<0) return TPCERROR_FAIL;
197 /* Check if there is enough space already */
198 int newTacNr, addTacNr, newParNr, addParNr;
199 newTacNr=par->tacNr+tacNr; addTacNr=newTacNr-par->_tacNr;
200 newParNr=par->parNr+parNr; addParNr=newParNr-par->_parNr;
201 if(addTacNr<=0 && addParNr<=0) return TPCERROR_OK;
202
203 /* Reallocate memory for parameter names and units, if necessary */
204 if(addParNr>0) {
205 PARN *parnPtr;
206 parnPtr=realloc(par->n, sizeof(PARN)*newParNr);
207 if(parnPtr==NULL) return TPCERROR_OUT_OF_MEMORY;
208 par->n=parnPtr;
209 parnPtr+=par->_parNr; for(int i=0; i<addParNr; i++) parnInit(parnPtr++);
210 }
211
212 /* Reallocate memory for parameters of previous TACs, if necessary */
213 if(addParNr>0) {
214 int i, j;
215 for(i=0; i<par->tacNr; i++) {
216 par->r[i].p=realloc(par->r[i].p, sizeof(double)*newParNr);
217 par->r[i].sd=realloc(par->r[i].sd, sizeof(double)*newParNr);
218 par->r[i].cl1=realloc(par->r[i].cl1, sizeof(double)*newParNr);
219 par->r[i].cl2=realloc(par->r[i].cl2, sizeof(double)*newParNr);
220 if(par->r[i].p==NULL || par->r[i].sd==NULL || par->r[i].cl1==NULL || par->r[i].cl2==NULL)
222 for(j=par->parNr; j<newParNr; j++)
223 par->r[i].p[j]=par->r[i].sd[j]=par->r[i].cl1[j]=par->r[i].cl2[j]=nan("");
224 }
225 }
226
227 /* Allocate memory for more TACs, if necessary */
228 if(addTacNr>0) {
229 PARR *parrPtr;
230 parrPtr=realloc(par->r, sizeof(PARR)*newTacNr);
231 if(parrPtr==NULL) return TPCERROR_OUT_OF_MEMORY;
232 par->r=parrPtr;
233 parrPtr+=par->_tacNr;
234 for(int i=0; i<addTacNr; i++, parrPtr++) {
235 parrInit(parrPtr);
236 if(parrAllocate(parrPtr, newParNr)!=TPCERROR_OK)
238 }
239 }
240
241 par->_parNr=newParNr;
242 par->_tacNr=newTacNr;
243 return TPCERROR_OK;
244}
245/*****************************************************************************/
246
247/*****************************************************************************/
254 PAR *par
255) {
256 if(par==NULL || par->tacNr<1) return(0);
257 for(int ri=0; ri<par->tacNr; ri++) if(!isnan(par->r[ri].wss)) return(1);
258 return(0);
259}
260/*****************************************************************************/
261
262/*****************************************************************************/
269 PAR *par
270) {
271 if(par==NULL || par->tacNr<1) return(0);
272 int ri, ret=0;
273 for(ri=0; ri<par->tacNr; ri++) {
274 if(!isnan(par->r[ri].start) || !isnan(par->r[ri].end)) ret=1;
275 if(ri==0 || ret==0) continue;
276 if(!doubleMatch(par->r[ri].start, par->r[0].start, 0.01)) {ret=2; break;}
277 if(!doubleMatch(par->r[ri].end, par->r[0].end, 0.01)) {ret=2; break;}
278 }
279 return(ret);
280}
281/*****************************************************************************/
282
283/*****************************************************************************/
290 PAR *par
291) {
292 if(par==NULL || par->tacNr<1) return(0);
293 int ret=0;
294 unsigned int mn=modelNr();;
295 for(int ri=0; ri<par->tacNr; ri++) {
296 if(ret==0 && par->r[ri].model>0 && par->r[ri].model<=mn) ret=1;
297 if(ri>0 && par->r[ri].model!=par->r[ri-1].model) {ret=2; break;}
298 }
299 return(ret);
300}
301/*****************************************************************************/
302
303/*****************************************************************************/
310 PAR *par,
312 int pi
313) {
314 //printf("%s(%d)\n", __func__, pi); fflush(stdout);
315 if(par==NULL || par->tacNr<1 || pi<0 || pi>=par->parNr) return(0);
316 for(int i=0; i<par->tacNr; i++) if(!isnan(par->r[i].sd[pi])) return(1);
317 return(0);
318}
319/*****************************************************************************/
320
321/*****************************************************************************/
328 PAR *par,
330 int pi
331) {
332 if(par==NULL || par->tacNr<1 || pi<0 || pi>=par->parNr) return(0);
333 for(int i=0; i<par->tacNr; i++)
334 if(!isnan(par->r[i].cl1[pi]) && !isnan(par->r[i].cl2[pi])) return(1);
335 return(0);
336}
337/*****************************************************************************/
338
339/*****************************************************************************/
346 PAR *par
347) {
348 if(par==NULL || par->tacNr<1) return(0);
349 int ri, ret=0;
350 for(ri=0; ri<par->tacNr; ri++) {
351 if(ret==0 && par->r[ri].fitNr>0) ret=1;
352 if(ri>0 && par->r[ri].fitNr!=par->r[ri-1].fitNr) {ret=2; break;}
353 }
354 return(ret);
355}
356/*****************************************************************************/
357
358/*****************************************************************************/
365 PAR *par
366) {
367 if(par==NULL || par->tacNr<1) return(0);
368 int ri, ret=0;
369 for(ri=0; ri<par->tacNr; ri++) {
370 if(ret==0 && par->r[ri].dataNr>0) ret=1;
371 if(ri>0 && par->r[ri].dataNr!=par->r[ri-1].dataNr) {ret=2; break;}
372 }
373 return(ret);
374}
375/*****************************************************************************/
376
377/*****************************************************************************/
384 PAR *par
385) {
386 if(par==NULL || par->h.keyNr<1) return((char*)NULL);
387 int li=iftFindKey(&par->h, "optimality_criterion", 0);
388 if(li<0) li=iftFindKey(&par->h, "optcrit", 0);
389 if(li<0) return((char*)NULL);
390 if(par->h.item[li].value==NULL || strlen(par->h.item[li].value)<1) return((char*)NULL);
391 return(par->h.item[li].value);
392}
393/*****************************************************************************/
394
395/*****************************************************************************/
402 PAR *par
403) {
404 if(par==NULL || par->h.keyNr<1) return((char*)NULL);
405 int li=iftFindKey(&par->h, "studynr", 0);
406 if(li<0) li=iftFindKey(&par->h, "study_number", 0);
407 if(li<0) return((char*)NULL);
408 if(par->h.item[li].value==NULL || strlen(par->h.item[li].value)<1) return((char*)NULL);
409 return(par->h.item[li].value);
410}
411/*****************************************************************************/
412
413/*****************************************************************************/
420 PAR *par,
423 const char *s
424) {
425 if(par==NULL) return TPCERROR_FAIL;
426
427 /* Find and delete previous studynr(s) */
428 int i=0, start=0;
429 while(1) {
430 i=iftFindKey(&par->h, "studynr", start);
431 if(i<0) i=iftFindKey(&par->h, "study_number", start);
432 if(i<0) i=iftFindKey(&par->h, "study number", start);
433 if(i<0) break;
434 iftDelete(&par->h, i); if(i>start) start=i;
435 }
436
437 /* If new studynr is empty, then just return */
438 if(s==NULL || *s=='\0') return(TPCERROR_OK);
439
440 /* Otherwise create new key and value */
441 return(iftPut(&par->h, "studynr", s, (char)1, NULL));
442}
443/*****************************************************************************/
444
445/*****************************************************************************/
452 PAR *d
453) {
454 if(d==NULL || d->tacNr<1 || d->parNr<1) return;
455 /* Ensure TAC names */
456 int u, n;
457 u=d->tacNr; n=1; while((u/=10)>=1) n++;
459 for(int i=0; i<d->tacNr; i++) {
460 if(strlen(d->r[i].name)<1 || strcmp(d->r[i].name, ".")==0)
461 sprintf(d->r[i].name, "%0*d", n, 1+i);
462 }
463 /* Ensure parameter names */
464 u=d->parNr; n=1; while((u/=10)>=1) n++;
466 for(int i=0; i<d->parNr; i++) {
467 if(strlen(d->n[i].name)<1 || strcmp(d->n[i].name, ".")==0)
468 sprintf(d->n[i].name, "P%0*d", n, 1+i);
469 }
470 return;
471}
472/*****************************************************************************/
473
474/*****************************************************************************/
481 PAR *par,
483 int pi
484) {
485 if(par==NULL || par->tacNr<1 || pi<0 || pi>=par->parNr) return(TPCERROR_FAIL);
486 if(pi==par->parNr-1) {par->parNr--; return(TPCERROR_OK);}
487
488 int i, j;
489
490 /* Parameter name and unit */
491 PARN parn;
492 memcpy(&parn, &par->n[pi], sizeof(PARN));
493 for(i=pi+1; i<par->parNr; i++)
494 memcpy(&par->n[i-1], &par->n[i], sizeof(PARN));
495 memcpy(&par->n[par->parNr-1], &parn, sizeof(PARN));
496
497 /* Parameter values */
498 double p, sd, cl1, cl2;
499 for(j=0; j<par->tacNr; j++) {
500 p=par->r[j].p[pi]; sd=par->r[j].sd[pi];
501 cl1=par->r[j].cl1[pi]; cl2=par->r[j].cl2[pi];
502 for(i=pi+1; i<par->parNr; i++) {
503 par->r[j].p[i-1]=par->r[j].p[i]; par->r[j].sd[i-1]=par->r[j].sd[i];
504 par->r[j].cl1[i-1]=par->r[j].cl1[i]; par->r[j].cl2[i-1]=par->r[j].cl2[i];
505 }
506 par->r[j].p[par->parNr-1]=p; par->r[j].sd[par->parNr-1]=sd;
507 par->r[j].cl1[par->parNr-1]=cl1; par->r[j].cl2[par->parNr-1]=cl2;
508 }
509
510 par->parNr--;
511 return(TPCERROR_OK);
512}
513/*****************************************************************************/
514
515/*****************************************************************************/
522 PAR *par,
524 int ti
525) {
526 if(par==NULL || par->tacNr<1 || ti<0 || ti>=par->tacNr) return(TPCERROR_FAIL);
527 /* Free the memory allocated for the TAC */
528 parrFree(par->r+ti);
529 /* If the last TAC is to be deleted, then just reduce the tacNr */
530 if(ti==par->tacNr-1) {par->tacNr--; return(TPCERROR_OK);}
531 /* Otherwise move the following TACs in its place */
532 for(int i=ti+1; i<par->tacNr; i++) par->r[i-1]=par->r[i];
533 par->tacNr--; parrInit(par->r+par->tacNr);
534 return(TPCERROR_OK);
535}
536/*****************************************************************************/
537
538/*****************************************************************************/
int doubleMatch(const double v1, const double v2, const double lim)
Definition doubleutil.c:27
void iftFree(IFT *ift)
Definition ift.c:37
int iftPut(IFT *ift, const char *key, const char *value, char comment, TPCSTATUS *status)
Definition ift.c:63
void iftInit(IFT *ift)
Definition ift.c:21
int iftDelete(IFT *ift, int index)
Definition ift.c:206
int iftFindKey(IFT *ift, const char *key, int start_index)
Definition iftfind.c:30
unsigned int modelNr()
Definition modell.c:162
int parIsFitRange(PAR *par)
Definition par.c:267
int parSDWithPar(PAR *par, int pi)
Definition par.c:308
char * parIsOptcrit(PAR *par)
Definition par.c:382
void parrFree(PARR *parr)
Definition par.c:87
int parDeletePar(PAR *par, int pi)
Definition par.c:479
void parFree(PAR *par)
Definition par.c:75
int parAllocate(PAR *par, int parNr, int tacNr)
Definition par.c:108
int parCLWithPar(PAR *par, int pi)
Definition par.c:326
void parEnsureNames(PAR *d)
Definition par.c:450
int parIsFitNr(PAR *par)
Definition par.c:344
int parrAllocate(PARR *parr, int parNr)
Definition par.c:150
int parIsWSS(PAR *par)
Definition par.c:252
int parIsDataNr(PAR *par)
Definition par.c:363
int parIsModel(PAR *par)
Definition par.c:288
void parrInit(PARR *parr)
Definition par.c:41
char * parIsStudyNr(PAR *par)
Definition par.c:400
void parnInit(PARN *parn)
Definition par.c:59
void parInit(PAR *par)
Definition par.c:25
int parDeleteTAC(PAR *par, int ti)
Definition par.c:520
int parSetStudyNr(PAR *par, const char *s)
Definition par.c:418
int parAllocateMore(PAR *par, int parNr, int tacNr)
Definition par.c:183
char * value
Definition tpcift.h:37
IFT_ITEM * item
Definition tpcift.h:57
int keyNr
Definition tpcift.h:47
Definition tpcpar.h:100
int format
Definition tpcpar.h:102
IFT h
Optional (but often useful) header information.
Definition tpcpar.h:147
int _parNr
Definition tpcpar.h:110
int parNr
Definition tpcpar.h:108
int tacNr
Definition tpcpar.h:104
PARR * r
Definition tpcpar.h:114
int _tacNr
Definition tpcpar.h:106
PARN * n
Definition tpcpar.h:112
Definition tpcpar.h:80
int unit
Definition tpcpar.h:86
double lim2
Definition tpcpar.h:90
char sw
Definition tpcpar.h:94
double tol
Definition tpcpar.h:92
char name[MAX_PARNAME_LEN+1]
Definition tpcpar.h:82
double lim1
Definition tpcpar.h:88
Definition tpcpar.h:46
double wss
Definition tpcpar.h:72
int fitNr
Definition tpcpar.h:58
char name[MAX_TACNAME_LEN+1]
Definition tpcpar.h:50
int dataNr
Definition tpcpar.h:62
double * cl2
Definition tpcpar.h:70
char sw
Definition tpcpar.h:74
unsigned int model
Definition tpcpar.h:48
double * p
Definition tpcpar.h:64
double start
Definition tpcpar.h:52
double * sd
Definition tpcpar.h:66
double * cl1
Definition tpcpar.h:68
double end
Definition tpcpar.h:54
Header file for library libtpcextensions.
#define MAX_TACNAME_LEN
Max length of TAC ID name (not including trailing zero).
@ UNIT_UNKNOWN
Unknown unit.
#define MAX_PARNAME_LEN
Max string length for PAR name.
@ TPCERROR_FAIL
General error.
@ TPCERROR_OUT_OF_MEMORY
Cannot allocate memory.
@ TPCERROR_OK
No error.
Header file for library libtpcift.
Header file for libtpcmodels.
Header file for libtpcpar.
@ PAR_FORMAT_UNKNOWN
Unknown format.
Definition tpcpar.h:28