MOOCHO (Single Doxygen Collection)  Version of the Day
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
RTOp_TOp_random_vector.c
Go to the documentation of this file.
1 /*
2 // @HEADER
3 // ***********************************************************************
4 //
5 // Moocho: Multi-functional Object-Oriented arCHitecture for Optimization
6 // Copyright (2003) Sandia Corporation
7 //
8 // Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
9 // license for use of this work by or on behalf of the U.S. Government.
10 //
11 // Redistribution and use in source and binary forms, with or without
12 // modification, are permitted provided that the following conditions are
13 // met:
14 //
15 // 1. Redistributions of source code must retain the above copyright
16 // notice, this list of conditions and the following disclaimer.
17 //
18 // 2. Redistributions in binary form must reproduce the above copyright
19 // notice, this list of conditions and the following disclaimer in the
20 // documentation and/or other materials provided with the distribution.
21 //
22 // 3. Neither the name of the Corporation nor the names of the
23 // contributors may be used to endorse or promote products derived from
24 // this software without specific prior written permission.
25 //
26 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
27 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
30 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
31 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
32 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
33 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
34 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
35 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
36 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37 //
38 // Questions? Contact Roscoe A. Bartlett (rabartl@sandia.gov)
39 //
40 // ***********************************************************************
41 // @HEADER
42 */
43 
44 /* */
45 /* RAB: 1/22/01: Warning, this implementation based */
46 /* on the struct may not be portable in a heterogeneous */
47 /* environment! The user has been warned! */
48 /* */
49 
50 #include <stdlib.h>
51 
52 #include "RTOp_TOp_random_vector.h"
53 #include "RTOp_obj_null_vtbl.h"
54 #include "RTOp_obj_free_free.h"
55 
56 /* Functions for the reduction/transformation object */
57 
61 };
62 
64  const struct RTOp_obj_type_vtbl_t* vtbl
65  ,const void* obj_data
66  ,int* num_values
67  ,int* num_indexes
68  ,int* num_chars
69  )
70 {
71  *num_values = 2;
72  *num_indexes = 0;
73  *num_chars = 0;
74  return 0;
75 }
76 
77 static int op_create(
78  const struct RTOp_obj_type_vtbl_t* vtbl, const void* instance_data
79  , RTOp_ReductTarget* obj )
80 {
81  *obj = malloc(sizeof(struct RTOp_TOp_random_vector_bnd_t));
82  return 0;
83 }
84 
85 static int extract_op_state(
86  const struct RTOp_obj_type_vtbl_t* vtbl
87  ,const void * dummy
88  ,void * obj_data
89  ,int num_values
90  ,RTOp_value_type value_data[]
91  ,int num_indexes
92  ,RTOp_index_type index_data[]
93  ,int num_chars
94  ,RTOp_char_type char_data[]
95  )
96 {
97  const struct RTOp_TOp_random_vector_bnd_t *bnd = NULL;
98  assert(obj_data);
99  assert( num_values == 2 );
100  assert( num_indexes == 0 );
101  assert( num_chars == 0 );
102  bnd = (const struct RTOp_TOp_random_vector_bnd_t*)obj_data;
103  value_data[0] = bnd->l;
104  value_data[1] = bnd->u;
105  return 0;
106 }
107 
108 static int load_op_state(
109  const struct RTOp_obj_type_vtbl_t* vtbl
110  ,const void * dummy
111  ,int num_values
112  ,const RTOp_value_type value_data[]
113  ,int num_indexes
114  ,const RTOp_index_type index_data[]
115  ,int num_chars
116  ,const RTOp_char_type char_data[]
117  ,void ** obj_data
118  )
119 {
120  struct RTOp_TOp_random_vector_bnd_t *bnd = NULL;
121  assert( obj_data );
122  assert( num_values == 2 );
123  assert( num_indexes == 0 );
124  assert( num_chars == 0 );
125  if(*obj_data == NULL)
126  *obj_data = malloc(sizeof(struct RTOp_TOp_random_vector_bnd_t));
127  bnd = (struct RTOp_TOp_random_vector_bnd_t*)*obj_data;
128  bnd->l = value_data[0];
129  bnd->u = value_data[1];
130  return 0;
131 }
132 
134 {
136  ,op_create
137  ,NULL
141 };
142 
143 /* Implementation functions for RTOp_RTOp */
144 
146  const struct RTOp_RTOp_vtbl_t* vtbl, const void* obj_data
147  , const int num_vecs, const struct RTOp_SubVector vecs[]
148  , const int num_targ_vecs, const struct RTOp_MutableSubVector targ_vecs[]
149  , RTOp_ReductTarget targ_obj )
150 {
151  /* */
152  /* Get pointers to data */
153  /* */
154 
155  /* lbnd, ubnd */
156  const struct RTOp_TOp_random_vector_bnd_t *bnd = (const struct RTOp_TOp_random_vector_bnd_t*)obj_data;
157 
158  /* z */
159  RTOp_index_type z_sub_dim;
160  RTOp_value_type *z_val = NULL;
161  ptrdiff_t z_val_s;
162 
163  register RTOp_index_type k;
164 
165  /* */
166  /* Validate the input */
167  /* */
168  if( num_vecs != 0 || vecs != NULL )
170  if( num_targ_vecs != 1 || targ_vecs == NULL )
172 
173  /* z */
174  z_sub_dim = targ_vecs[0].sub_dim;
175  z_val = targ_vecs[0].values;
176  z_val_s = targ_vecs[0].values_stride;
177 
178  /* */
179  /* Assign the elements to random values */
180  /* */
181 
182  for( k = 0; k < z_sub_dim; ++k, z_val += z_val_s )
183  *z_val = bnd->l + ((RTOp_value_type)rand())/RAND_MAX * (bnd->u - bnd->l);
184 
185  return 0; /* success? */
186 }
187 
188 /* Virtual function table */
190 {
192  ,&RTOp_obj_null_vtbl /* use null type for target object */
193  ,"TOp_random_vector"
194  ,NULL /* use default from reduct_vtbl */
196  ,NULL
197  ,NULL
198 };
199 
200 /* Class specific functions */
201 
203  , struct RTOp_RTOp* op )
204 {
205  struct RTOp_TOp_random_vector_bnd_t *bnd = NULL;
207  op->vtbl->obj_data_vtbl->obj_create(NULL,NULL,&op->obj_data);
208  bnd = (struct RTOp_TOp_random_vector_bnd_t*)op->obj_data;
209  bnd->l = lbnd;
210  bnd->u = ubnd;
211  return 0; /* success? */
212 }
213 
215 {
216  free( op->obj_data );
217  op->obj_data = NULL;
218  op->vtbl = NULL;
219  return 0; /* success? */
220 }
221 
223  , struct RTOp_RTOp* op )
224 {
226  bnd->l = lbnd;
227  bnd->u = ubnd;
228  return 0; /* success? */
229 }
double RTOp_value_type
Definition: RTOp.h:69
ptrdiff_t values_stride
Definition: RTOp.h:338
int RTOp_TOp_random_vector_set_bounds(RTOp_value_type lbnd, RTOp_value_type ubnd, struct RTOp_RTOp *op)
void * RTOp_ReductTarget
Definition: RTOp.h:191
int(* obj_create)(const struct RTOp_obj_type_vtbl_t *vtbl, const void *instance_data, void **obj)
Definition: RTOp.h:941
const struct RTOp_obj_type_vtbl_t * obj_data_vtbl
Definition: RTOp.h:819
static int extract_op_state(const struct RTOp_obj_type_vtbl_t *vtbl, const void *dummy, void *obj_data, int num_values, RTOp_value_type value_data[], int num_indexes, RTOp_index_type index_data[], int num_chars, RTOp_char_type char_data[])
char RTOp_char_type
Definition: RTOp.h:70
static int load_op_state(const struct RTOp_obj_type_vtbl_t *vtbl, const void *dummy, int num_values, const RTOp_value_type value_data[], int num_indexes, const RTOp_index_type index_data[], int num_chars, const RTOp_char_type char_data[], void **obj_data)
RTOp_index_type sub_dim
Definition: RTOp.h:334
#define RTOp_ERR_INVALID_NUM_VECS
Definition: RTOp.h:266
RTOp_value_type * values
Definition: RTOp.h:336
const struct RTOp_obj_type_vtbl_t RTOp_obj_null_vtbl
static int op_create(const struct RTOp_obj_type_vtbl_t *vtbl, const void *instance_data, RTOp_ReductTarget *obj)
int RTOp_TOp_random_vector_destroy(struct RTOp_RTOp *op)
static int RTOp_TOp_random_vector_apply_op(const struct RTOp_RTOp_vtbl_t *vtbl, const void *obj_data, const int num_vecs, const struct RTOp_SubVector vecs[], const int num_targ_vecs, const struct RTOp_MutableSubVector targ_vecs[], RTOp_ReductTarget targ_obj)
void * obj_data
Definition: RTOp.h:800
const struct RTOp_RTOp_vtbl_t * vtbl
Definition: RTOp.h:802
const struct RTOp_RTOp_vtbl_t RTOp_TOp_random_vector_vtbl
int RTOp_TOp_random_vector_construct(RTOp_value_type lbnd, RTOp_value_type ubnd, struct RTOp_RTOp *op)
static struct RTOp_obj_type_vtbl_t instance_obj_vtbl
int RTOp_obj_free_free(const struct RTOp_obj_type_vtbl_t *vtbl, const void *instance_data, void **obj)
static int get_op_type_num_entries(const struct RTOp_obj_type_vtbl_t *vtbl, const void *obj_data, int *num_values, int *num_indexes, int *num_chars)
#define RTOp_ERR_INVALID_NUM_TARG_VECS
Definition: RTOp.h:268
Teuchos_Ordinal RTOp_index_type
Definition: RTOp.h:68