source: stable/1.15/Clp/src/ClpHelperFunctions.cpp @ 1989

Last change on this file since 1989 was 1817, checked in by forrest, 8 years ago

add ClpTraceDebug?

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