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

Last change on this file since 1185 was 1185, checked in by ladanyi, 12 years ago

include cstdlib before cmath to get things to compile on AIX with xlC

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 3.7 KB
Line 
1// Copyright (C) 2003, International Business Machines
2// Corporation and others.  All Rights Reserved.
3
4/*
5    Note (JJF) I have added some operations on arrays even though they may
6    duplicate CoinDenseVector.  I think the use of templates was a mistake
7    as I don't think inline generic code can take as much advantage of
8    parallelism or machine architectures or memory hierarchies.
9
10*/
11#include <cfloat>
12#include <cstdlib>
13#include <cmath>
14#include "CoinHelperFunctions.hpp"
15#include "CoinFinite.hpp"
16double 
17maximumAbsElement(const double * region, int size)
18{
19  int i;
20  double maxValue=0.0;
21  for (i=0;i<size;i++) 
22    maxValue = CoinMax(maxValue,fabs(region[i]));
23  return maxValue;
24}
25void 
26setElements(double * region, int size, double value)
27{
28  int i;
29  for (i=0;i<size;i++) 
30    region[i]=value;
31}
32void 
33multiplyAdd(const double * region1, int size, double multiplier1,
34                 double * region2, double multiplier2)
35{
36  int i;
37  if (multiplier1==1.0) {
38    if (multiplier2==1.0) {
39      for (i=0;i<size;i++) 
40        region2[i] = region1[i] + region2[i];
41    } else if (multiplier2==-1.0) {
42      for (i=0;i<size;i++) 
43        region2[i] = region1[i] - region2[i];
44    } else if (multiplier2==0.0) {
45      for (i=0;i<size;i++) 
46        region2[i] = region1[i] ;
47    } else {
48      for (i=0;i<size;i++) 
49        region2[i] = region1[i] + multiplier2*region2[i];
50    }
51  } else if (multiplier1==-1.0) {
52    if (multiplier2==1.0) {
53      for (i=0;i<size;i++) 
54        region2[i] = -region1[i] + region2[i];
55    } else if (multiplier2==-1.0) {
56      for (i=0;i<size;i++) 
57        region2[i] = -region1[i] - region2[i];
58    } else if (multiplier2==0.0) {
59      for (i=0;i<size;i++) 
60        region2[i] = -region1[i] ;
61    } else {
62      for (i=0;i<size;i++) 
63        region2[i] = -region1[i] + multiplier2*region2[i];
64    }
65  } else if (multiplier1==0.0) {
66    if (multiplier2==1.0) {
67      // nothing to do
68    } else if (multiplier2==-1.0) {
69      for (i=0;i<size;i++) 
70        region2[i] =  -region2[i];
71    } else if (multiplier2==0.0) {
72      for (i=0;i<size;i++) 
73        region2[i] =  0.0;
74    } else {
75      for (i=0;i<size;i++) 
76        region2[i] =  multiplier2*region2[i];
77    }
78  } else {
79    if (multiplier2==1.0) {
80      for (i=0;i<size;i++) 
81        region2[i] = multiplier1*region1[i] + region2[i];
82    } else if (multiplier2==-1.0) {
83      for (i=0;i<size;i++) 
84        region2[i] = multiplier1*region1[i] - region2[i];
85    } else if (multiplier2==0.0) {
86      for (i=0;i<size;i++) 
87        region2[i] = multiplier1*region1[i] ;
88    } else {
89      for (i=0;i<size;i++) 
90        region2[i] = multiplier1*region1[i] + multiplier2*region2[i];
91    }
92  }
93}
94double 
95innerProduct(const double * region1, int size, const double * region2)
96{
97  int i;
98  double value=0.0;
99  for (i=0;i<size;i++)
100    value += region1[i]*region2[i];
101  return value;
102}
103void 
104getNorms(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#ifdef DEBUG_MEMORY
115#include <malloc.h>
116#include <stdio.h>
117#include <stdlib.h>
118
119typedef void (*NEW_HANDLER)();
120static NEW_HANDLER new_handler;                        // function to call if `new' fails (cf. ARM p. 281)
121
122// Allocate storage.
123void *
124operator new(size_t size)
125{
126  void * p;
127  for (;;)
128    {
129      p = malloc(size);
130      if      (p)           break;        // success
131      else if (new_handler) new_handler();   // failure - try again (allow user to release some storage first)
132      else                  break;        // failure - no retry
133    }
134  if (size>1000000)
135    printf("Allocating memory of size %d\n",size);
136  return p;
137}
138
139// Deallocate storage.
140void
141operator delete(void *p)
142{
143  free(p);
144  return;
145}
146void
147operator delete [] (void *p)
148{
149  free(p);
150  return;
151}
152#endif
Note: See TracBrowser for help on using the repository browser.