1
/* libctl: flexible Guile-based control files for scientific software
2
* Copyright (C) 1998, 1999, 2000, 2001, 2002, Steven G. Johnson
4
* This library is free software; you can redistribute it and/or
5
* modify it under the terms of the GNU Lesser General Public
6
* License as published by the Free Software Foundation; either
7
* version 2 of the License, or (at your option) any later version.
9
* This library is distributed in the hope that it will be useful,
10
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12
* Lesser General Public License for more details.
14
* You should have received a copy of the GNU Lesser General Public
15
* License along with this library; if not, write to the
16
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17
* Boston, MA 02111-1307, USA.
19
* Steven G. Johnson can be contacted at stevenj@alum.mit.edu.
29
#endif /* __cplusplus */
31
/**************************************************************************/
32
/* Configuration options (guessed by configure).
33
We have to put them here, rather than in a private config.h file,
34
because they need to be known by user ctl-io.c and main.c files. */
36
/* set to version string */
38
#undef LIBCTL_MAJOR_VERSION
39
#undef LIBCTL_MINOR_VERSION
40
#undef LIBCTL_BUGFIX_VERSION
42
/* Define if you have the following functions */
44
#undef HAVE_GH_BOOL2SCM
45
#undef HAVE_GH_VECTOR_REF
46
#undef HAVE_GH_LIST_REF
48
#undef HAVE_SCM_FLUSH_ALL_PORTS
49
#undef HAVE_SCM_MAKE_COMPLEX
50
#undef HAVE_SCM_VARIABLE_SET_X
51
#undef HAVE_SCM_C_LOOKUP
53
/* Define if you have the HAVE_SCM_COMPLEXP macro. */
54
#undef HAVE_SCM_COMPLEXP
56
/* Define if gh_lookup is not broken */
59
/**************************************************************************/
64
typedef double number;
65
typedef struct { number re, im; } cnumber; /* complex numbers! */
66
typedef short boolean;
72
/* define vector3 as a structure, not an array, so that it can
73
be a function return value and so that simple assignment works. */
74
typedef struct { number x,y,z; } vector3;
76
/* similarly for matrix3x3 */
77
typedef struct { vector3 c0, c1, c2; /* the columns */ } matrix3x3;
79
/* define complex equivalents: */
80
typedef struct { cnumber x,y,z; } cvector3;
81
typedef struct { cvector3 c0, c1, c2; /* the columns */ } cmatrix3x3;
83
/**************************************************************************/
86
# define gh_lookup scm_symbol_value0
90
# define gh_load gh_eval_file
93
extern void ctl_include(char *filename);
94
extern char *ctl_fix_path(const char *path);
96
/**************************************************************************/
98
/* vector3 and matrix3x3 utilities: */
100
extern number vector3_dot(vector3 v1,vector3 v2);
101
extern number vector3_norm(vector3 v);
102
extern vector3 vector3_scale(number s, vector3 v);
103
extern vector3 unit_vector3(vector3 v);
104
extern vector3 vector3_cross(vector3 v1,vector3 v2);
105
extern vector3 vector3_plus(vector3 v1,vector3 v2);
106
extern vector3 vector3_minus(vector3 v1,vector3 v2);
108
extern vector3 matrix3x3_vector3_mult(matrix3x3 m, vector3 v);
109
extern matrix3x3 matrix3x3_mult(matrix3x3 m1, matrix3x3 m2);
110
extern matrix3x3 matrix3x3_transpose(matrix3x3 m);
111
extern number matrix3x3_determinant(matrix3x3 m);
112
extern matrix3x3 matrix3x3_inverse(matrix3x3 m);
114
/**************************************************************************/
116
/* complex number utilities */
119
extern cnumber make_cnumber(number r, number i);
120
extern cnumber cnumber_conj(cnumber c);
121
#define cnumber_re(c) ((c).re)
122
#define cnumber_im(c) ((c).im)
124
extern vector3 cvector3_re(cvector3 cv);
125
extern vector3 cvector3_im(cvector3 cv);
126
extern cvector3 make_cvector3(vector3 vr, vector3 vi);
128
extern matrix3x3 cmatrix3x3_re(cmatrix3x3 cm);
129
extern matrix3x3 cmatrix3x3_im(cmatrix3x3 cm);
130
extern cmatrix3x3 make_cmatrix3x3(matrix3x3 mr, matrix3x3 mi);
131
cmatrix3x3 make_hermitian_cmatrix3x3(number m00, number m11, number m22,
132
cnumber m01, cnumber m02, cnumber m12);
134
/**************************************************************************/
136
/* type conversion */
138
#ifndef HAVE_GH_BOOL2SCM
139
/* Guile 1.2 is missing gh_bool2scm for some reason; redefine: */
140
extern SCM bool2scm(boolean);
141
#define gh_bool2scm bool2scm
144
extern vector3 scm2vector3(SCM sv);
145
extern SCM vector32scm(vector3 v);
146
extern matrix3x3 scm2matrix3x3(SCM sm);
147
extern SCM matrix3x32scm(matrix3x3 m);
149
extern cnumber scm2cnumber(SCM sx);
150
extern SCM cnumber2scm(cnumber x);
151
extern cvector3 scm2cvector3(SCM sv);
152
extern SCM cvector32scm(cvector3 v);
153
extern cmatrix3x3 scm2cmatrix3x3(SCM sm);
154
extern SCM cmatrix3x32scm(cmatrix3x3 m);
156
#define ctl_convert_number_to_scm(x) gh_double2scm(x)
157
#define ctl_convert_cnumber_to_scm(x) cnumber2scm(x)
158
#define ctl_convert_integer_to_scm(x) gh_int2scm(x)
159
#define ctl_convert_string_to_scm(x) gh_str02scm(x)
160
#define ctl_convert_boolean_to_scm(x) gh_bool2scm(x)
161
#define ctl_convert_vector3_to_scm(x) vector32scm(x)
162
#define ctl_convert_matrix3x3_to_scm(x) matrix3x32scm(x)
163
#define ctl_convert_cvector3_to_scm(x) cvector32scm(x)
164
#define ctl_convert_cmatrix3x3_to_scm(x) cmatrix3x32scm(x)
165
#define ctl_convert_SCM_to_scm(x) (x)
166
#define ctl_convert_function_to_scm(x) (x)
167
#define ctl_convert_object_to_scm(x) (x)
168
#define ctl_convert_list_to_scm(x) (x)
170
#define ctl_convert_number_to_c(x) gh_scm2double(x)
171
#define ctl_convert_cnumber_to_c(x) scm2cnumber(x)
172
#define ctl_convert_integer_to_c(x) gh_scm2int(x)
173
#define ctl_convert_string_to_c(x) gh_scm2newstr(x, 0)
174
#define ctl_convert_boolean_to_c(x) gh_scm2bool(x)
175
#define ctl_convert_vector3_to_c(x) scm2vector3(x)
176
#define ctl_convert_matrix3x3_to_c(x) scm2matrix3x3(x)
177
#define ctl_convert_cvector3_to_c(x) scm2cvector3(x)
178
#define ctl_convert_cmatrix3x3_to_c(x) scm2cmatrix3x3(x)
179
#define ctl_convert_SCM_to_c(x) (x)
180
#define ctl_convert_function_to_c(x) (x)
181
#define ctl_convert_object_to_c(x) (x)
182
#define ctl_convert_list_to_c(x) (x)
184
/**************************************************************************/
186
/* variable get/set functions */
188
extern integer ctl_get_integer(char *identifier);
189
extern number ctl_get_number(char *identifier);
190
extern cnumber ctl_get_cnumber(char *identifier);
191
extern boolean ctl_get_boolean(char *identifier);
192
extern char* ctl_get_string(char *identifier);
193
extern vector3 ctl_get_vector3(char *identifier);
194
extern matrix3x3 ctl_get_matrix3x3(char *identifier);
195
extern cvector3 ctl_get_cvector3(char *identifier);
196
extern cmatrix3x3 ctl_get_cmatrix3x3(char *identifier);
197
extern list ctl_get_list(char *identifier);
198
extern object ctl_get_object(char *identifier);
199
extern function ctl_get_function(char *identifier);
200
extern SCM ctl_get_SCM(char *identifier);
202
extern void ctl_set_integer(char *identifier, integer value);
203
extern void ctl_set_number(char *identifier, number value);
204
extern void ctl_set_cnumber(char *identifier, cnumber value);
205
extern void ctl_set_boolean(char *identifier, boolean value);
206
extern void ctl_set_string(char *identifier, char *value);
207
extern void ctl_set_vector3(char *identifier, vector3 value);
208
extern void ctl_set_matrix3x3(char *identifier, matrix3x3 value);
209
extern void ctl_set_cvector3(char *identifier, cvector3 value);
210
extern void ctl_set_cmatrix3x3(char *identifier, cmatrix3x3 value);
211
extern void ctl_set_list(char *identifier, list value);
212
extern void ctl_set_object(char *identifier, object value);
213
extern void ctl_set_function(char *identifier, function value);
214
extern void ctl_set_SCM(char *identifier, SCM value);
216
/**************************************************************************/
220
extern int list_length(list l);
221
extern integer integer_list_ref(list l, int index);
222
extern number number_list_ref(list l, int index);
223
extern cnumber cnumber_list_ref(list l, int index);
224
extern boolean boolean_list_ref(list l, int index);
225
extern char* string_list_ref(list l, int index);
226
extern vector3 vector3_list_ref(list l, int index);
227
extern matrix3x3 matrix3x3_list_ref(list l, int index);
228
extern cvector3 cvector3_list_ref(list l, int index);
229
extern cmatrix3x3 cmatrix3x3_list_ref(list l, int index);
230
extern list list_list_ref(list l, int index);
231
extern object object_list_ref(list l, int index);
232
extern function function_list_ref(list l, int index);
233
extern SCM SCM_list_ref(list l, int index);
235
/**************************************************************************/
239
extern list make_integer_list(int num_items, integer *items);
240
extern list make_number_list(int num_items, number *items);
241
extern list make_cnumber_list(int num_items, cnumber *items);
242
extern list make_boolean_list(int num_items, boolean *items);
243
extern list make_string_list(int num_items, char **items);
244
extern list make_vector3_list(int num_items, vector3 *items);
245
extern list make_matrix3x3_list(int num_items, matrix3x3 *items);
246
extern list make_cvector3_list(int num_items, cvector3 *items);
247
extern list make_cmatrix3x3_list(int num_items, cmatrix3x3 *items);
248
extern list make_list_list(int num_items, list *items);
249
extern list make_object_list(int num_items, object *items);
250
extern list make_function_list(int num_items, function *items);
251
extern list make_SCM_list(int num_items, function *items);
253
/**************************************************************************/
255
/* object properties */
257
boolean object_is_member(char *type_name, object o);
259
extern integer integer_object_property(object o, char *property_name);
260
extern number number_object_property(object o, char *property_name);
261
extern cnumber cnumber_object_property(object o, char *property_name);
262
extern boolean boolean_object_property(object o, char *property_name);
263
extern char* string_object_property(object o, char *property_name);
264
extern vector3 vector3_object_property(object o, char *property_name);
265
extern matrix3x3 matrix3x3_object_property(object o, char *property_name);
266
extern cvector3 cvector3_object_property(object o, char *property_name);
267
extern cmatrix3x3 cmatrix3x3_object_property(object o, char *property_name);
268
extern list list_object_property(object o, char *property_name);
269
extern object object_object_property(object o, char *property_name);
270
extern function function_object_property(object o, char *property_name);
271
extern SCM SCM_object_property(object o, char *property_name);
273
/**************************************************************************/
275
/* main() hook functions. These are prototypes of functions
276
defined by the USER and called just before the program starts
277
and just before it ends, respectively. If you want to define
278
them, you should also define HAVE_CTL_HOOKS when compiling main.c.
280
Note that due to the behavior of the Guile interactive mode,
281
ctl_stop_hook will only get called in non-interactive mode. Sigh. */
283
extern void ctl_start_hook(int *argc, char ***argv);
284
extern void ctl_stop_hook(void);
286
/**************************************************************************/
288
/* subplex multi-dimensional minimization routines: */
290
typedef number (*subplex_func) (integer, number *, void *);
292
extern number subplex(subplex_func f, number *x, integer n, void *fdata,
293
number tol, integer maxnfe,
294
number fmin, boolean use_fmin,
296
integer *nfe, integer *errflag);
297
extern SCM subplex_scm(SCM f_scm, SCM x_scm,
298
SCM tol_scm, SCM maxnfe_scm,
299
SCM fmin_scm, SCM use_fmin_scm,
302
/**************************************************************************/
306
#endif /* __cplusplus */