source: trunk/ADOL-C/src/forward_partx.c @ 71

Last change on this file since 71 was 42, checked in by awalther, 10 years ago

set svn keywords property

  • Property svn:keywords set to Author Date Id Revision
File size: 5.8 KB
Line 
1/*----------------------------------------------------------------------------
2 ADOL-C -- Automatic Differentiation by Overloading in C++
3 File:     forward_partx.c
4 Revision: $Id: forward_partx.c 42 2009-07-15 18:37:17Z awalther $
5 Contents:
6 
7 Copyright (c) Andrea Walther
8 
9 This file is part of ADOL-C. This software is provided as open source.
10 Any use, reproduction, or distribution of the software constitutes
11 recipient's acceptance of the terms of the accompanying license file.
12 
13----------------------------------------------------------------------------*/
14
15#include <adalloc.h>
16#include <interfaces.h>
17
18BEGIN_C_DECLS
19
20/*--------------------------------------------------------------------------*/
21/*                                                                ZOS_PARTX */
22/* zos_forward_partx(tag, m, mdim[n], n, x[n][d], y[m])                     */
23/* (based on zos_forward)                                                   */
24
25int zos_forward_partx(short tag, int m, int n, int *ndim, double **x, double *y) {
26    double *x0;        /* base point */
27    int i,j,ind,sum_n, rc;
28
29    sum_n = 0;
30    for(i=0;i<n;i++)
31        sum_n += ndim[i];
32
33    x0 = myalloc1(sum_n);
34
35    ind = 0;
36    for(i=0;i<n;i++)
37        for(j=0;j<ndim[i];j++) {
38            x0[ind] = x[i][j];
39            ind++;
40        }
41
42    rc = zos_forward(tag,m,sum_n,0,x0,y);
43
44    myfree1(x0);
45
46    return rc;
47}
48
49
50/*--------------------------------------------------------------------------*/
51/*                                                                FOS_PARTX */
52/* fos_forward_partx(tag, m, n, ndim[n], x[n][][2], y[m][2])                */
53/* (based on fos_forward)                                                   */
54
55int fos_forward_partx(short tag, int m, int n, int *ndim, double ***x, double **y) {
56    double *x0;        /* base point */
57    double *xtay;      /* Taylor coefficients */
58    double *y0;        /* result */
59    double *ytay;      /* derivatives */
60    int i,j,ind,sum_n, rc;
61
62    sum_n = 0;
63    for(i=0;i<n;i++)
64        sum_n += ndim[i];
65
66    x0 = myalloc1(sum_n);
67    xtay = myalloc1(sum_n);
68    y0 = myalloc1(m);
69    ytay = myalloc1(m);
70
71    ind = 0;
72    for(i=0;i<n;i++)
73        for(j=0;j<ndim[i];j++) {
74            x0[ind] = x[i][j][0];
75            xtay[ind] = x[i][j][1];
76            ind++;
77        }
78
79    rc = fos_forward(tag,m,sum_n,0,x0,xtay,y0,ytay);
80
81    for(i=0;i<m;i++) {
82        y[i][0] = y0[i];
83        y[i][1] = ytay[i];
84    }
85
86    myfree1(x0);
87    myfree1(xtay);
88    myfree1(y0);
89    myfree1(ytay);
90
91    return rc;
92}
93
94
95/*--------------------------------------------------------------------------*/
96/*                                                                HOS_PARTX */
97/* hos_forward_partx(tag, m, n, ndim[n], d, x[n][][d+1], y[m][d+1])         */
98/* (based on hos_forward)                                                   */
99
100int hos_forward_partx(short tag, int m, int n, int *ndim, int d, double ***x, double **y) {
101    double *x0;        /* base point */
102    double **xtay;     /* Taylor coefficients */
103    double *y0;        /* result */
104    double **ytay;     /* derivaties */
105    int i,j,k,ind,sum_n, rc;
106
107    sum_n = 0;
108    for(i=0;i<n;i++)
109        sum_n += ndim[i];
110
111    x0 = myalloc1(sum_n);
112    xtay = myalloc2(sum_n,d);
113    y0 = myalloc1(m);
114    ytay = myalloc2(m,d);
115
116    ind = 0;
117    for(i=0;i<n;i++)
118        for(j=0;j<ndim[i];j++) {
119            x0[ind] = x[i][j][0];
120            for(k=0;k<d;k++)
121                xtay[ind][k] = x[i][j][k+1];
122            ind++;
123        }
124
125    rc = hos_forward(tag,m,sum_n,d,0,x0,xtay,y0,ytay);
126
127    for(i=0;i<m;i++) {
128        y[i][0] = y0[i];
129        for(j=0;j<d;j++)
130            y[i][j+1] = ytay[i][j];
131    }
132
133    myfree1(x0);
134    myfree2(xtay);
135    myfree1(y0);
136    myfree2(ytay);
137
138    return rc;
139}
140
141/*--------------------------------------------------------------------------*/
142/*                                                                FOV_PARTX */
143/* fov_forward_partx(tag, m, n, ndim[n], p, x[n][], X[n][][p],
144                     y[m], Y[m][p]) */
145/* (based on fov_forward)                                                   */
146
147int fov_forward_partx(short tag, int m, int n, int *ndim,int p,
148                      double **x, double ***Xppp, double* y, double **Ypp) {
149    double *x0;      /* base point */
150    double **X;      /* Taylor coefficients */
151    int i,j,k,ind,sum_n, rc;
152
153    sum_n = 0;
154    for(i=0;i<n;i++)
155        sum_n += ndim[i];
156
157    x0 = myalloc1(sum_n);
158    X = myalloc2(sum_n,p);
159
160    ind = 0;
161    for(i=0;i<n;i++)
162        for(j=0;j<ndim[i];j++) {
163            x0[ind] = x[i][j];
164            for(k=0;k<p;k++)
165                X[ind][k] = Xppp[i][j][k];
166            ind++;
167        }
168
169    rc = fov_forward(tag,m,sum_n,p,x0,X,y,Ypp);
170
171    myfree1(x0);
172    myfree2(X);
173
174    return rc;
175}
176
177/*--------------------------------------------------------------------------*/
178/*                                                                HOV_PARTX */
179/* hov_forward_partx(tag, m, n, ndim[n], p, x[n][], X[n][][p][d],
180                     y[m], Y[m][p][d]) */
181/* (based on hov_forward)                                                   */
182
183int hov_forward_partx(short tag, int m, int n, int *ndim, int d, int p,
184                      double **x, double ****Xpppp, double* y, double ***Yppp) {
185    double *x0;       /* base point */
186    double ***X;      /* Taylor coefficients */
187    int i,j,k,l,ind,sum_n, rc;
188
189    sum_n = 0;
190    for(i=0;i<n;i++)
191        sum_n += ndim[i];
192
193    x0 = myalloc1(sum_n);
194    X = myalloc3(sum_n,p,d);
195
196    ind = 0;
197    for(i=0;i<n;i++)
198        for(j=0;j<ndim[i];j++) {
199            x0[ind] = x[i][j];
200            for(k=0;k<p;k++)
201                for(l=0;l<d;l++)
202                    X[ind][k][l] = Xpppp[i][j][k][l];
203            ind++;
204
205        }
206
207    rc = hov_forward(tag,m,sum_n,d,p,x0,X,y,Yppp);
208
209    myfree1(x0);
210    myfree3(X);
211
212    return rc;
213}
214
215/****************************************************************************/
216
217END_C_DECLS
Note: See TracBrowser for help on using the repository browser.