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

Last change on this file since 1370 was 1370, checked in by forrest, 10 years ago

add ids

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 6.3 KB
Line 
1/* $Id: ClpHelperFunctions.cpp 1370 2009-06-04 09:37:13Z forrest $ */
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    {
231      p = malloc(size);
232      if      (p)           break;        // success
233      else if (new_handler) new_handler();   // failure - try again (allow user to release some storage first)
234      else                  break;        // failure - no retry
235    }
236  if (size>1000000)
237    printf("Allocating memory of size %d\n",size);
238  return p;
239}
240
241// Deallocate storage.
242void
243operator delete(void *p)
244{
245  free(p);
246  return;
247}
248void
249operator delete [] (void *p)
250{
251  free(p);
252  return;
253}
254#endif
Note: See TracBrowser for help on using the repository browser.