source: trunk/Clp/src/ClpHelperFunctions.cpp @ 1525

Last change on this file since 1525 was 1525, checked in by mjs, 10 years ago

Formatted .cpp, .hpp, .c, .h files with "astyle -A4 -p". This matches the formatting used in the grand CBC reorganization.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 7.9 KB
Line 
1/* $Id: ClpHelperFunctions.cpp 1525 2010-02-26 17:27:59Z mjs $ */
2// Copyright (C) 2003, International Business Machines
3// Corporation and others.  All Rights Reserved.
4
5/*
6    Note (JJF) I have added some operations on arrays even though they may
7    duplicate CoinDenseVector.  I think the use of templates was a mistake
8    as I don't think inline generic code can take as much advantage of
9    parallelism or machine architectures or memory hierarchies.
10
11*/
12#include <cfloat>
13#include <cstdlib>
14#include <cmath>
15#include "CoinHelperFunctions.hpp"
16#include "CoinFinite.hpp"
17double
18maximumAbsElement(const double * region, int size)
19{
20     int i;
21     double maxValue = 0.0;
22     for (i = 0; i < size; i++)
23          maxValue = CoinMax(maxValue, fabs(region[i]));
24     return maxValue;
25}
26void
27setElements(double * region, int size, double value)
28{
29     int i;
30     for (i = 0; i < size; i++)
31          region[i] = value;
32}
33void
34multiplyAdd(const double * region1, int size, double multiplier1,
35            double * region2, double multiplier2)
36{
37     int i;
38     if (multiplier1 == 1.0) {
39          if (multiplier2 == 1.0) {
40               for (i = 0; i < size; i++)
41                    region2[i] = region1[i] + region2[i];
42          } else if (multiplier2 == -1.0) {
43               for (i = 0; i < size; i++)
44                    region2[i] = region1[i] - region2[i];
45          } else if (multiplier2 == 0.0) {
46               for (i = 0; i < size; i++)
47                    region2[i] = region1[i] ;
48          } else {
49               for (i = 0; i < size; i++)
50                    region2[i] = region1[i] + multiplier2 * region2[i];
51          }
52     } else if (multiplier1 == -1.0) {
53          if (multiplier2 == 1.0) {
54               for (i = 0; i < size; i++)
55                    region2[i] = -region1[i] + region2[i];
56          } else if (multiplier2 == -1.0) {
57               for (i = 0; i < size; i++)
58                    region2[i] = -region1[i] - region2[i];
59          } else if (multiplier2 == 0.0) {
60               for (i = 0; i < size; i++)
61                    region2[i] = -region1[i] ;
62          } else {
63               for (i = 0; i < size; i++)
64                    region2[i] = -region1[i] + multiplier2 * region2[i];
65          }
66     } else if (multiplier1 == 0.0) {
67          if (multiplier2 == 1.0) {
68               // nothing to do
69          } else if (multiplier2 == -1.0) {
70               for (i = 0; i < size; i++)
71                    region2[i] =  -region2[i];
72          } else if (multiplier2 == 0.0) {
73               for (i = 0; i < size; i++)
74                    region2[i] =  0.0;
75          } else {
76               for (i = 0; i < size; i++)
77                    region2[i] =  multiplier2 * region2[i];
78          }
79     } else {
80          if (multiplier2 == 1.0) {
81               for (i = 0; i < size; i++)
82                    region2[i] = multiplier1 * region1[i] + region2[i];
83          } else if (multiplier2 == -1.0) {
84               for (i = 0; i < size; i++)
85                    region2[i] = multiplier1 * region1[i] - region2[i];
86          } else if (multiplier2 == 0.0) {
87               for (i = 0; i < size; i++)
88                    region2[i] = multiplier1 * region1[i] ;
89          } else {
90               for (i = 0; i < size; i++)
91                    region2[i] = multiplier1 * region1[i] + multiplier2 * region2[i];
92          }
93     }
94}
95double
96innerProduct(const double * region1, int size, const double * region2)
97{
98     int i;
99     double value = 0.0;
100     for (i = 0; i < size; i++)
101          value += region1[i] * region2[i];
102     return value;
103}
104void
105getNorms(const double * region, int size, double & norm1, double & norm2)
106{
107     norm1 = 0.0;
108     norm2 = 0.0;
109     int i;
110     for (i = 0; i < size; i++) {
111          norm2 += region[i] * region[i];
112          norm1 = CoinMax(norm1, fabs(region[i]));
113     }
114}
115#if COIN_LONG_WORK
116// For long double versions
117CoinWorkDouble
118maximumAbsElement(const CoinWorkDouble * region, int size)
119{
120     int i;
121     CoinWorkDouble maxValue = 0.0;
122     for (i = 0; i < size; i++)
123          maxValue = CoinMax(maxValue, CoinAbs(region[i]));
124     return maxValue;
125}
126void
127setElements(CoinWorkDouble * region, int size, CoinWorkDouble value)
128{
129     int i;
130     for (i = 0; i < size; i++)
131          region[i] = value;
132}
133void
134multiplyAdd(const CoinWorkDouble * region1, int size, CoinWorkDouble multiplier1,
135            CoinWorkDouble * region2, CoinWorkDouble multiplier2)
136{
137     int i;
138     if (multiplier1 == 1.0) {
139          if (multiplier2 == 1.0) {
140               for (i = 0; i < size; i++)
141                    region2[i] = region1[i] + region2[i];
142          } else if (multiplier2 == -1.0) {
143               for (i = 0; i < size; i++)
144                    region2[i] = region1[i] - region2[i];
145          } else if (multiplier2 == 0.0) {
146               for (i = 0; i < size; i++)
147                    region2[i] = region1[i] ;
148          } else {
149               for (i = 0; i < size; i++)
150                    region2[i] = region1[i] + multiplier2 * region2[i];
151          }
152     } else if (multiplier1 == -1.0) {
153          if (multiplier2 == 1.0) {
154               for (i = 0; i < size; i++)
155                    region2[i] = -region1[i] + region2[i];
156          } else if (multiplier2 == -1.0) {
157               for (i = 0; i < size; i++)
158                    region2[i] = -region1[i] - region2[i];
159          } else if (multiplier2 == 0.0) {
160               for (i = 0; i < size; i++)
161                    region2[i] = -region1[i] ;
162          } else {
163               for (i = 0; i < size; i++)
164                    region2[i] = -region1[i] + multiplier2 * region2[i];
165          }
166     } else if (multiplier1 == 0.0) {
167          if (multiplier2 == 1.0) {
168               // nothing to do
169          } else if (multiplier2 == -1.0) {
170               for (i = 0; i < size; i++)
171                    region2[i] =  -region2[i];
172          } else if (multiplier2 == 0.0) {
173               for (i = 0; i < size; i++)
174                    region2[i] =  0.0;
175          } else {
176               for (i = 0; i < size; i++)
177                    region2[i] =  multiplier2 * region2[i];
178          }
179     } else {
180          if (multiplier2 == 1.0) {
181               for (i = 0; i < size; i++)
182                    region2[i] = multiplier1 * region1[i] + region2[i];
183          } else if (multiplier2 == -1.0) {
184               for (i = 0; i < size; i++)
185                    region2[i] = multiplier1 * region1[i] - region2[i];
186          } else if (multiplier2 == 0.0) {
187               for (i = 0; i < size; i++)
188                    region2[i] = multiplier1 * region1[i] ;
189          } else {
190               for (i = 0; i < size; i++)
191                    region2[i] = multiplier1 * region1[i] + multiplier2 * region2[i];
192          }
193     }
194}
195CoinWorkDouble
196innerProduct(const CoinWorkDouble * region1, int size, const CoinWorkDouble * region2)
197{
198     int i;
199     CoinWorkDouble value = 0.0;
200     for (i = 0; i < size; i++)
201          value += region1[i] * region2[i];
202     return value;
203}
204void
205getNorms(const CoinWorkDouble * region, int size, CoinWorkDouble & norm1, CoinWorkDouble & norm2)
206{
207     norm1 = 0.0;
208     norm2 = 0.0;
209     int i;
210     for (i = 0; i < size; i++) {
211          norm2 += region[i] * region[i];
212          norm1 = CoinMax(norm1, CoinAbs(region[i]));
213     }
214}
215#endif
216#ifdef DEBUG_MEMORY
217#include <malloc.h>
218#include <stdio.h>
219#include <stdlib.h>
220
221typedef void (*NEW_HANDLER)();
222static NEW_HANDLER new_handler;                        // function to call if `new' fails (cf. ARM p. 281)
223
224// Allocate storage.
225void *
226operator new(size_t size)
227{
228     void * p;
229     for (;;) {
230          p = malloc(size);
231          if      (p)           break;        // success
232          else if (new_handler) new_handler();   // failure - try again (allow user to release some storage first)
233          else                  break;        // failure - no retry
234     }
235     if (size > 1000000)
236          printf("Allocating memory of size %d\n", size);
237     return p;
238}
239
240// Deallocate storage.
241void
242operator delete(void *p)
243{
244     free(p);
245     return;
246}
247void
248operator delete [] (void *p)
249{
250     free(p);
251     return;
252}
253#endif
Note: See TracBrowser for help on using the repository browser.