ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
vec_flt.h
Go to the documentation of this file.
1//===--- vec_int.h ----------------------------------------------------------===
2//
3// satoko: Satisfiability solver
4//
5// This file is distributed under the BSD 2-Clause License.
6// See LICENSE for details.
7//
8//===------------------------------------------------------------------------===
9#ifndef satoko__utils__vec__vec_flt_h
10#define satoko__utils__vec__vec_flt_h
11
12#include <assert.h>
13#include <stdio.h>
14#include <string.h>
15
16#include "../mem.h"
17
20
21typedef struct vec_flt_t_ vec_flt_t;
22struct vec_flt_t_ {
23 unsigned cap;
24 unsigned size;
25 float *data;
26};
27
28//===------------------------------------------------------------------------===
29// Vector Macros
30//===------------------------------------------------------------------------===
31#define vec_flt_foreach(vec, entry, i) \
32 for (i = 0; (i < vec->size) && (((entry) = vec_flt_at(vec, i)), 1); i++)
33
34#define vec_flt_foreach_start(vec, entry, i, start) \
35 for (i = start; (i < vec_flt_size(vec)) && (((entry) = vec_flt_at(vec, i)), 1); i++)
36
37#define vec_flt_foreach_stop(vec, entry, i, stop) \
38 for (i = 0; (i < stop) && (((entry) = vec_flt_at(vec, i)), 1); i++)
39
40//===------------------------------------------------------------------------===
41// Vector API
42//===------------------------------------------------------------------------===
43static inline vec_flt_t *vec_flt_alloc(unsigned cap)
44{
46
47 if (cap > 0 && cap < 16)
48 cap = 16;
49 p->size = 0;
50 p->cap = cap;
51 p->data = p->cap ? satoko_alloc(float, p->cap) : NULL;
52 return p;
53}
54
55static inline vec_flt_t *vec_flt_alloc_exact(unsigned cap)
56{
58
59 p->size = 0;
60 p->cap = cap;
61 p->data = p->cap ? satoko_alloc(float, p->cap) : NULL;
62 return p;
63}
64
65static inline vec_flt_t *vec_flt_init(unsigned size, float value)
66{
68
69 p->cap = size;
70 p->size = size;
71 p->data = p->cap ? satoko_alloc(float, p->cap) : NULL;
72 memset(p->data, value, sizeof(float) * p->size);
73 return p;
74}
75
76static inline void vec_flt_free(vec_flt_t *p)
77{
78 if (p->data != NULL)
79 satoko_free(p->data);
81}
82
83static inline unsigned vec_flt_size(vec_flt_t *p)
84{
85 return p->size;
86}
87
88static inline void vec_flt_resize(vec_flt_t *p, unsigned new_size)
89{
90 p->size = new_size;
91 if (p->cap >= new_size)
92 return;
93 p->data = satoko_realloc(float, p->data, new_size);
94 assert(p->data != NULL);
95 p->cap = new_size;
96}
97
98static inline void vec_flt_reserve(vec_flt_t *p, unsigned new_cap)
99{
100 if (p->cap >= new_cap)
101 return;
102 p->data = satoko_realloc(float, p->data, new_cap);
103 assert(p->data != NULL);
104 p->cap = new_cap;
105}
106
107static inline unsigned vec_flt_capacity(vec_flt_t *p)
108{
109 return p->cap;
110}
111
112static inline int vec_flt_empty(vec_flt_t *p)
113{
114 return p->size ? 0 : 1;
115}
116
117static inline void vec_flt_erase(vec_flt_t *p)
118{
119 satoko_free(p->data);
120 p->size = 0;
121 p->cap = 0;
122}
123
124static inline float vec_flt_at(vec_flt_t *p, unsigned i)
125{
126 assert(i >= 0 && i < p->size);
127 return p->data[i];
128}
129
130static inline float *vec_flt_at_ptr(vec_flt_t *p, unsigned i)
131{
132 assert(i >= 0 && i < p->size);
133 return p->data + i;
134}
135
136static inline float *vec_flt_data(vec_flt_t *p)
137{
138 assert(p);
139 return p->data;
140}
141
142static inline void vec_flt_duplicate(vec_flt_t *dest, const vec_flt_t *src)
143{
144 assert(dest != NULL && src != NULL);
145 vec_flt_resize(dest, src->cap);
146 memcpy(dest->data, src->data, sizeof(float) * src->cap);
147 dest->size = src->size;
148}
149
150static inline void vec_flt_copy(vec_flt_t *dest, const vec_flt_t *src)
151{
152 assert(dest != NULL && src != NULL);
153 vec_flt_resize(dest, src->size);
154 memcpy(dest->data, src->data, sizeof(float) * src->size);
155 dest->size = src->size;
156}
157
158static inline void vec_flt_push_back(vec_flt_t *p, float value)
159{
160 if (p->size == p->cap) {
161 if (p->cap < 16)
162 vec_flt_reserve(p, 16);
163 else
164 vec_flt_reserve(p, 2 * p->cap);
165 }
166 p->data[p->size] = value;
167 p->size++;
168}
169
170static inline void vec_flt_assign(vec_flt_t *p, unsigned i, float value)
171{
172 assert((i >= 0) && (i < vec_flt_size(p)));
173 p->data[i] = value;
174}
175
176static inline void vec_flt_insert(vec_flt_t *p, unsigned i, float value)
177{
178 assert((i >= 0) && (i < vec_flt_size(p)));
179 vec_flt_push_back(p, 0);
180 memmove(p->data + i + 1, p->data + i, (p->size - i - 2) * sizeof(float));
181 p->data[i] = value;
182}
183
184static inline void vec_flt_drop(vec_flt_t *p, unsigned i)
185{
186 assert((i >= 0) && (i < vec_flt_size(p)));
187 memmove(p->data + i, p->data + i + 1, (p->size - i - 1) * sizeof(float));
188 p->size -= 1;
189}
190
191static inline void vec_flt_clear(vec_flt_t *p)
192{
193 p->size = 0;
194}
195
196static inline int vec_flt_asc_compare(const void *p1, const void *p2)
197{
198 const float *pp1 = (const float *) p1;
199 const float *pp2 = (const float *) p2;
200
201 if (*pp1 < *pp2)
202 return -1;
203 if (*pp1 > *pp2)
204 return 1;
205 return 0;
206}
207
208static inline int vec_flt_desc_compare(const void* p1, const void* p2)
209{
210 const float *pp1 = (const float *) p1;
211 const float *pp2 = (const float *) p2;
212
213 if (*pp1 > *pp2)
214 return -1;
215 if (*pp1 < *pp2)
216 return 1;
217 return 0;
218}
219
220static inline void vec_flt_sort(vec_flt_t* p, int ascending)
221{
222 if (ascending)
223 qsort((void *) p->data, (size_t)p->size, sizeof(float),
224 (int (*)(const void*, const void*)) vec_flt_asc_compare);
225 else
226 qsort((void *) p->data, (size_t)p->size, sizeof(float),
227 (int (*)(const void*, const void*)) vec_flt_desc_compare);
228}
229
230static inline long vec_flt_memory(vec_flt_t *p)
231{
232 return p == NULL ? 0 : sizeof(float) * p->cap + sizeof(vec_flt_t);
233}
234
235static inline void vec_flt_print(vec_flt_t *p)
236{
237 unsigned i;
238 assert(p != NULL);
239 fprintf(stdout, "Vector has %u(%u) entries: {", p->size, p->cap);
240 for (i = 0; i < p->size; i++)
241 fprintf(stdout, " %f", p->data[i]);
242 fprintf(stdout, " }\n");
243}
244
246#endif /* satoko__utils__vec__vec_flt_h */
#define ABC_NAMESPACE_HEADER_END
#define ABC_NAMESPACE_HEADER_START
NAMESPACES ///.
ABC_NAMESPACE_IMPL_START typedef signed char value
Cube * p
Definition exorList.c:222
unsigned long long size
Definition giaNewBdd.h:39
#define satoko_free(p)
Definition mem.h:20
#define satoko_realloc(type, ptr, n_elements)
Definition mem.h:19
#define satoko_alloc(type, n_elements)
Definition mem.h:17
unsigned size
Definition vec_flt.h:24
unsigned cap
Definition vec_flt.h:23
float * data
Definition vec_flt.h:25
#define assert(ex)
Definition util_old.h:213
char * memcpy()
char * memset()
char * memmove()
typedefABC_NAMESPACE_HEADER_START struct vec_flt_t_ vec_flt_t
Definition vec_flt.h:21