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

Last change on this file since 2470 was 2385, checked in by unxusr, 9 months ago

formatting

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 7.4 KB
Line 
1/* $Id: ClpHelperFunctions.cpp 2385 2019-01-06 19:43:06Z stefan $ */
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 setElements(double *region, int size, double value)
29{
30  int i;
31  for (i = 0; i < size; i++)
32    region[i] = value;
33}
34void multiplyAdd(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 getNorms(const double *region, int size, double &norm1, double &norm2)
105{
106  norm1 = 0.0;
107  norm2 = 0.0;
108  int i;
109  for (i = 0; i < size; i++) {
110    norm2 += region[i] * region[i];
111    norm1 = CoinMax(norm1, fabs(region[i]));
112  }
113}
114#ifndef NDEBUG
115#include "ClpModel.hpp"
116#include "ClpMessage.hpp"
117ClpModel *clpTraceModel = NULL; // Set to trap messages
118void ClpTracePrint(std::string fileName, std::string message, int lineNumber)
119{
120  if (!clpTraceModel) {
121    std::cout << fileName << ":" << lineNumber << " : \'"
122              << message << "\' failed." << std::endl;
123  } else {
124    char line[1000];
125    sprintf(line, "%s: %d : \'%s\' failed.", fileName.c_str(), lineNumber, message.c_str());
126    clpTraceModel->messageHandler()->message(CLP_GENERAL_WARNING, clpTraceModel->messages())
127      << line
128      << CoinMessageEol;
129  }
130}
131#endif
132#if COIN_LONG_WORK
133// For long double versions
134CoinWorkDouble
135maximumAbsElement(const CoinWorkDouble *region, int size)
136{
137  int i;
138  CoinWorkDouble maxValue = 0.0;
139  for (i = 0; i < size; i++)
140    maxValue = CoinMax(maxValue, CoinAbs(region[i]));
141  return maxValue;
142}
143void setElements(CoinWorkDouble *region, int size, CoinWorkDouble value)
144{
145  int i;
146  for (i = 0; i < size; i++)
147    region[i] = value;
148}
149void multiplyAdd(const CoinWorkDouble *region1, int size, CoinWorkDouble multiplier1,
150  CoinWorkDouble *region2, CoinWorkDouble multiplier2)
151{
152  int i;
153  if (multiplier1 == 1.0) {
154    if (multiplier2 == 1.0) {
155      for (i = 0; i < size; i++)
156        region2[i] = region1[i] + region2[i];
157    } else if (multiplier2 == -1.0) {
158      for (i = 0; i < size; i++)
159        region2[i] = region1[i] - region2[i];
160    } else if (multiplier2 == 0.0) {
161      for (i = 0; i < size; i++)
162        region2[i] = region1[i];
163    } else {
164      for (i = 0; i < size; i++)
165        region2[i] = region1[i] + multiplier2 * region2[i];
166    }
167  } else if (multiplier1 == -1.0) {
168    if (multiplier2 == 1.0) {
169      for (i = 0; i < size; i++)
170        region2[i] = -region1[i] + region2[i];
171    } else if (multiplier2 == -1.0) {
172      for (i = 0; i < size; i++)
173        region2[i] = -region1[i] - region2[i];
174    } else if (multiplier2 == 0.0) {
175      for (i = 0; i < size; i++)
176        region2[i] = -region1[i];
177    } else {
178      for (i = 0; i < size; i++)
179        region2[i] = -region1[i] + multiplier2 * region2[i];
180    }
181  } else if (multiplier1 == 0.0) {
182    if (multiplier2 == 1.0) {
183      // nothing to do
184    } else if (multiplier2 == -1.0) {
185      for (i = 0; i < size; i++)
186        region2[i] = -region2[i];
187    } else if (multiplier2 == 0.0) {
188      for (i = 0; i < size; i++)
189        region2[i] = 0.0;
190    } else {
191      for (i = 0; i < size; i++)
192        region2[i] = multiplier2 * region2[i];
193    }
194  } else {
195    if (multiplier2 == 1.0) {
196      for (i = 0; i < size; i++)
197        region2[i] = multiplier1 * region1[i] + region2[i];
198    } else if (multiplier2 == -1.0) {
199      for (i = 0; i < size; i++)
200        region2[i] = multiplier1 * region1[i] - region2[i];
201    } else if (multiplier2 == 0.0) {
202      for (i = 0; i < size; i++)
203        region2[i] = multiplier1 * region1[i];
204    } else {
205      for (i = 0; i < size; i++)
206        region2[i] = multiplier1 * region1[i] + multiplier2 * region2[i];
207    }
208  }
209}
210CoinWorkDouble
211innerProduct(const CoinWorkDouble *region1, int size, const CoinWorkDouble *region2)
212{
213  int i;
214  CoinWorkDouble value = 0.0;
215  for (i = 0; i < size; i++)
216    value += region1[i] * region2[i];
217  return value;
218}
219void getNorms(const CoinWorkDouble *region, int size, CoinWorkDouble &norm1, CoinWorkDouble &norm2)
220{
221  norm1 = 0.0;
222  norm2 = 0.0;
223  int i;
224  for (i = 0; i < size; i++) {
225    norm2 += region[i] * region[i];
226    norm1 = CoinMax(norm1, CoinAbs(region[i]));
227  }
228}
229#endif
230#ifdef DEBUG_MEMORY
231#include <malloc.h>
232#include <stdio.h>
233#include <stdlib.h>
234
235typedef void (*NEW_HANDLER)();
236static NEW_HANDLER new_handler; // function to call if `new' fails (cf. ARM p. 281)
237
238// Allocate storage.
239void *
240operator new(size_t size)
241{
242  void *p;
243  for (;;) {
244    p = malloc(size);
245    if (p)
246      break; // success
247    else if (new_handler)
248      new_handler(); // failure - try again (allow user to release some storage first)
249    else
250      break; // failure - no retry
251  }
252  if (size > 1000000)
253    printf("Allocating memory of size %d\n", size);
254  return p;
255}
256
257// Deallocate storage.
258void operator delete(void *p)
259{
260  free(p);
261  return;
262}
263void operator delete[](void *p)
264{
265  free(p);
266  return;
267}
268#endif
269
270/* vi: softtabstop=2 shiftwidth=2 expandtab tabstop=2
271*/
Note: See TracBrowser for help on using the repository browser.