Implement the bitonic sort in src/sn_network.c.
[sort-networks.git] / src / sn_network.h
1 /**
2  * \file sn_network.h
3  * \brief The sn_network_t class and associated methods.
4  *
5  * This is more details about what this file does.
6  *
7  * \verbatim
8  * libsortnetwork - src/sn_network.h
9  * Copyright (C) 2008-2010  Florian octo Forster
10  *
11  * This library is free software; you can redistribute it and/or modify it
12  * under the terms of the GNU Lesser General Public License as published by
13  * the Free Software Foundation; either version 2.1 of the License, or (at
14  * your option) any later version.
15  *
16  * This library is distributed in the hope that it will be useful, but WITHOUT
17  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
18  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
19  * for more details.
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * along with this library; if not, write to the Free Software Foundation,
23  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
24  *
25  * Authors:
26  *   Florian octo Forster <ff at octo.it>
27  * \endverbatim
28  **/
29
30 #ifndef SN_NETWORK_H
31 #define SN_NETWORK_H 1
32
33 #include <stdio.h>
34
35 #include "sn_comparator.h"
36 #include "sn_stage.h"
37
38 /**
39  * The global struct representing a comparator or sort network.
40  */
41 struct sn_network_s
42 {
43   int inputs_num;       /**< Number of inputs of the comparator network. */
44   sn_stage_t **stages;  /**< Array of pointers to the stages of a comparator network. */
45   int stages_num;       /**< Number of stages in this comparator network. */
46 };
47 typedef struct sn_network_s sn_network_t;
48
49 #define SN_NETWORK_STAGE_NUM(n) (n)->stages_num
50 #define SN_NETWORK_STAGE_GET(n,i) ((n)->stages[i])
51 #define SN_NETWORK_INPUT_NUM(n) (n)->inputs_num
52
53 /**
54  * Creates an empty comparator network and returns a pointer to it. The
55  * comparator network must be freed using sn_network_destroy().
56  *
57  * \param inputs_num Number of inputs the comparator network has.
58  * \return Pointer to the comparator network or \c NULL on error.
59  */
60 sn_network_t *sn_network_create (int inputs_num);
61
62 /**
63  * Clones an existing comparator network.
64  *
65  * \param n Comparator network to clone.
66  * \return Copied sort network or \c NULL on error. The returned network must
67  *   be freed using sn_network_destroy().
68  */
69 sn_network_t *sn_network_clone (const sn_network_t *n);
70
71 /**
72  * Destroys a comparator network allocated with sn_network_create() or one of
73  * the other methods returning a \c sn_network_t. This frees all allocated
74  * space.
75  *
76  * \param n The comparator network to destroy. May be \c NULL.
77  */
78 void sn_network_destroy (sn_network_t *n);
79
80 /**
81  * Creates a new sort network using Batcher's Odd-Even-Mergesort algorithm.
82  *
83  * \param inputs_num Number of inputs / outputs of the sorting network.
84  * \return A pointer to the newly allocated sorting network or \c NULL if an
85  *   invalid number of inputs was given or allocation failed.
86  */
87 sn_network_t *sn_network_create_odd_even_mergesort (int inputs_num);
88
89 /**
90  * Creates a new sort network using Batcher's Bitonic-Mergesort algorithm.
91  *
92  * \param inputs_num Number of inputs / outputs of the sorting network.
93  * \return A pointer to the newly allocated sorting network or \c NULL if an
94  *   invalid number of inputs was given or allocation failed.
95  */
96 sn_network_t *sn_network_create_bitonic_mergesort (int inputs_num);
97
98 /**
99  * Creates a new sorting network using the Pairwise sorting algorithm published
100  * by Ian Parberry.
101  * \param inputs_num Number of inputs / outputs of the sorting network.
102  * \return A pointer to the newly allocated sorting network or \c NULL if an
103  *   invalid number of inputs was given or allocation failed.
104  */
105 sn_network_t *sn_network_create_pairwise (int inputs_num);
106
107 /**
108  * Append another network to a given network.
109  *
110  * \param n The comparator network to which the other network is added. This
111  *   network is modified.
112  * \param other The network to be added to the first network. This network is
113  *   consumed by this function and the memory pointed to is freed. You cannot
114  *   use that network after this call, so use sn_network_clone() if required.
115  * \return Zero on success, non-zero on failure.
116  */
117 int sn_network_network_add (sn_network_t *n, sn_network_t *other);
118
119 /**
120  * Append a new stage to a comparator network.
121  *
122  * \param n The comparator network to which to add the stage.
123  * \param s A pointer to a stage. The memory pointed to by this parameter is
124  *   not copied and freed by sn_network_destroy(). It is the caller's
125  *   responsibility to call sn_stage_clone() if appropriate.
126  * \return Zero on success, non-zero on failure.
127  */
128 int sn_network_stage_add (sn_network_t *n, sn_stage_t *s);
129
130 /**
131  * Remove a stage from a comparator network.
132  *
133  * \param n A pointer to the comparator network to modify.
134  * \param s_num The depth of the comparator network to remove, with zero being
135  *   meaning the stage closest to the inputs.
136  * \return Zero on success, non-zero on failure.
137  */
138 int sn_network_stage_remove (sn_network_t *n, int s_num);
139
140 /**
141  * Adds a comparator to a comparator network. The code tries to add the
142  * comparator to the last stage, i.e. the stage closest to the outputs. If this
143  * is not possible, because one line is used by another comparator, a new stage
144  * is created and appended to the sorting network.
145  *
146  * \param n Pointer to the comparator netork.
147  * \param c Pointer to a comparator to add. The given comparator is copied. It
148  *   is the caller's responsibility to free c.
149  * \return Zero on success, non-zero on failure.
150  */
151 int sn_network_comparator_add (sn_network_t *n, const sn_comparator_t *c);
152
153 /**
154  * Returns the number of comparators contained in the comparator network. This
155  * will traverse all comparators in all stages, resulting in a running time of
156  * \f$ \mathcal{O}(n) \f$.
157  *
158  * \param n Comparator network to work with.
159  * \return The number of comparators contained in the network or less than zero
160  *  on error (\c n is \c NULL).
161  */
162 int sn_network_get_comparator_num (const sn_network_t *n);
163
164 /**
165  * Applies a comparator network to an array of integers. This is implemented by
166  * calling sn_stage_sort() with every stage of the network.
167  *
168  * \param n Pointer to the comparator netork.
169  * \param[in,out] values Pointer to integer values to sort. The number of
170  *   integer values pointed to must be at least the number of inputs of the
171  *   comparator network. Otherwise, segmentation faults or memory corruption
172  *   will occur.
173  * \return Zero on success, non-zero on failure.
174  * \see sn_stage_sort
175  */
176 int sn_network_sort (sn_network_t *n, int *values);
177
178 /**
179  * Checks whether a given comparator network is a sorting network by testing
180  * all \f$ 2^n \f$ 0-1-patterns. Since this function has exponential running
181  * time, using it with comparator networks with many inputs is not advisable.
182  *
183  * \param n The comparator network to test.
184  * \return Zero if the comparator network is a sort network, one if the
185  *   comparator network is \em not a sort network, or something else on error.
186  */
187 int sn_network_brute_force_check (sn_network_t *n);
188
189 /**
190  * Prints the comparator network to \c STDOUT using a human readable
191  * representation.
192  *
193  * \param n The comparator network to display.
194  * \return Zero on success, non-zero on failure.
195  */
196 int sn_network_show (sn_network_t *n);
197
198 /**
199  * Inverts a comparator network by switching the direction of all comparators.
200  *
201  * \param n The network to invert.
202  * \return Zero on success, non-zero on failure.
203  */
204 int sn_network_invert (sn_network_t *n);
205
206 /**
207  * Shifts a comparator network (permutes the inputs). Each input is shifted
208  * \f$ s \f$ positions, higher inputs are "wrapped around".
209  *
210  * \param n The comparator network to shift.
211  * \param s The number of positions to shift.
212  * \return Zero on success, non-zero on failure.
213  */
214 int sn_network_shift (sn_network_t *n, int s);
215
216 /**
217  * Compresses a comparator network by moving all comparators to the earliest
218  * possible stage and removing all remaining empty stages.
219  *
220  * \param n The network to compress.
221  * \return Zero on success, non-zero on failure.
222  */
223 int sn_network_compress (sn_network_t *n);
224
225 /**
226  * Converts a non-standard comparator network to a standard comparator network,
227  * i.e. a network in which all comparators point in the same direction.
228  *
229  * \param n The network to normalize.
230  * \return Zero on success, non-zero on failure.
231  */
232 int sn_network_normalize (sn_network_t *n);
233
234 /**
235  * Removes an input and all comparators touching that input from the comparator
236  * network.
237  *
238  * \param n The network to modify.
239  * \param input The zero-based index of the input to remove.
240  * \return Zero on success, non-zero on failure.
241  */
242 int sn_network_remove_input (sn_network_t *n, int input);
243
244 /**
245  * Removes an inputs from a comparator network by assuming positive or negative
246  * infinity to be supplied to a given input. The value will take a
247  * deterministic way through the comparator network. After removing the path
248  * and all comparators it touched from the comparator network, a new comparator
249  * network with \f$ n-1 \f$ inputs remains. The remaining outputs behave
250  * identical to the original network with respect to one another.
251  *
252  * \param n The comparator network to modify.
253  * \param input The input to remove.
254  * \param dir The direction in which to cut, i.e. whether to assume positive or
255  *   negative infinity.
256  * \return Zero on success, non-zero on failure.
257  */
258 int sn_network_cut_at (sn_network_t *n, int input, enum sn_network_cut_dir_e dir);
259
260 /* FIXME: Documentation */
261 int sn_network_cut (sn_network_t *n, int *mask);
262
263 /**
264  * An alias for sn_network_combine_odd_even_merge().
265  */
266 sn_network_t *sn_network_combine (sn_network_t *n0, sn_network_t *n1);
267
268 /**
269  * Combines two comparator networks using a bitonic merger. The number of
270  * inputs of both comparator networks must be identical and a power of two.
271  *
272  * \param n0 First network.
273  * \param n1 Second network.
274  * \return Newly allocated network with twice the number of inputs or \c NULL
275  *   on error.
276  */
277 sn_network_t *sn_network_combine_bitonic_merge (sn_network_t *n0, sn_network_t *n1);
278
279 /**
280  * Combines two comparator networks using the odd-even-merger.
281  *
282  * \param n0 First network.
283  * \param n1 Second network.
284  * \return Newly allocated network or \c NULL on error.
285  */
286 sn_network_t *sn_network_combine_odd_even_merge (sn_network_t *n0, sn_network_t *n1);
287
288 /**
289  * Reads a comparator network from a open file handle.
290  *
291  * \param fh The FILE pointer to read from.
292  * \return A newly allocated comparator network or \c NULL on error.
293  * \see sn_network_read_file
294  */
295 sn_network_t *sn_network_read (FILE *fh);
296
297 /**
298  * Reads a comparator network from a file.
299  *
300  * \param file File name to read the network from.
301  * \return A newly allocated comparator network or \c NULL on error.
302  * \see sn_network_read
303  */
304 sn_network_t *sn_network_read_file (const char *file);
305
306 /**
307  * Writes a comparator network to a file handle.
308  *
309  * \param n The comparator network to write.
310  * \param fh The file handle to write to. Must be opened in write mode.
311  * \return Zero on success, non-zero on failure.
312  * \see sn_network_write_file
313  */
314 int sn_network_write (sn_network_t *n, FILE *fh);
315
316 /**
317  * Writes a comparator network to a file.
318  *
319  * \param n The comparator network to write.
320  * \param fh The file name to write the network to.
321  * \return Zero on success, non-zero on failure.
322  * \see sn_network_write
323  */
324 int sn_network_write_file (sn_network_t *n, const char *file);
325
326 /**
327  * Creates a serialized form of the given comparator network. The serialized
328  * form is byte-order independent and can easily be sent over a computer
329  * network.
330  *
331  * \param n The comparator network to serialize.
332  * \param[out] ret_buffer Pointer to a pointer into which the location of the
333  *   allocated memory will be written. It is the caller's responsibility to
334  *   free this memory.
335  * \param[out] ret_buffer_size Pointer to a size_t into which the size of the
336  *   allocated memory will be written.
337  * \return Zero on success, non-zero on failure.
338  * \see sn_network_unserialize
339  */
340 int sn_network_serialize (sn_network_t *n, char **ret_buffer,
341     size_t *ret_buffer_size);
342
343 /**
344  * Creates a comparator network from its serialized form.
345  *
346  * \param buffer Pointer to a buffer containing the comparator network in
347  *   serialized form.
348  * \param buffer_size Size of the buffer (in bytes).
349  * \return Pointer to the newly allocated comparator network or \c NULL on
350  *   error.
351  * \see sn_network_serialize
352  */
353 sn_network_t *sn_network_unserialize (char *buffer, size_t buffer_size);
354 #endif /* SN_NETWORK_H */
355
356 /* vim: set shiftwidth=2 softtabstop=2 : */