source: git/factory/cfGEval.cc @ 5df7d0

spielwiese
Last change on this file since 5df7d0 was c1b9927, checked in by Hans Schoenemann <hannes@…>, 13 years ago
- removed some unsed variables - never put static inline routine without a body in a .h file git-svn-id: file:///usr/local/Singular/svn/trunk@14265 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 5.9 KB
Line 
1#include <config.h>
2
3#include "cfGEval.h"
4#include "cf_generator.h"
5
6GEvaluation::GEvaluation( const GEvaluation & e )
7{
8    if ( e.gen == 0 )
9      gen = 0;
10    else
11    {
12      for (int i= 0; i < values.max() - values.min() + 1; i++)
13        delete gen[i];
14      delete [] gen;
15
16      gen= new CFGenerator* [e.values.max() - e.values.min() + 1];
17      for (int i= 0; i < e.values.max() - e.values.min() + 1; i++)
18        gen[i] = e.gen[i]->clone();
19    }
20    values = e.values;
21}
22
23GEvaluation::GEvaluation (int min0, int max0, const CFGenerator & sample): Evaluation (min0, max0)
24{
25  gen= new CFGenerator* [max0 - min0 + 1];
26  for (int i= 0; i < max0 - min0 + 1; i++)
27    gen[i]= sample.clone();
28}
29
30GEvaluation::~GEvaluation()
31{
32    if ( gen != 0 )
33    {
34      for (int i= 0; i < values.max() - values.max() + 1; i++)
35        delete gen[i];
36      delete [] gen;
37    }
38}
39
40GEvaluation&
41GEvaluation::operator= ( const GEvaluation & e )
42{
43  if ( this != &e )
44  {
45    if (gen!=0)
46    {
47      for (int i= 0; i < values.max() - values.min() + 1; i++)
48        delete gen[i];
49      delete [] gen;
50    }
51    if ( e.gen == 0 )
52      gen = 0;
53    else
54    {
55      gen= new CFGenerator* [e.values.max() - e.values.min() + 1];
56      for (int i= 0; i < e.values.max() - e.values.min() + 1; i++)
57        gen[i] = e.gen[i]->clone();
58    }
59    values = e.values;
60  }
61  return *this;
62}
63
64void
65GEvaluation::reset()
66{
67  int t= values.max();
68  int u= values.min();
69  for (int i= u; i <= t; i++)
70  {
71    values[i]= 0;
72    gen[i - u]->reset();
73  }
74}
75
76void
77GEvaluation::init (int n)
78{
79  #ifndef NOASSERT
80  int t= values.max();
81  #endif
82  int u= values.min();
83  ASSERT (n <= t - u + 1, "wrong number of evaluation points");
84  for (int i= u; i <= u + n - 1; i++)
85  {
86    gen[i - u]->next();
87    values[i]= gen[i - u]->item();
88  }
89}
90
91bool
92GEvaluation::nextpoint (int n) // n= number of non zero components
93{
94  int t= values.max();
95  int u= values.min();
96  ASSERT (n <= t - u + 1, "wrong number of evaluation points");
97  if (t - u + 1 < n) return false;
98  for (int i= u; i <= t; i++)
99  {
100    if (!values[i].isZero())
101    {
102      if (n == 1)
103      {
104        if (gen[i - u]->hasItems())
105        {
106          gen[i - u]->next();
107          values[i]= gen[i - u]->item();
108          return true;
109        }
110        else if (!gen [i - u]->hasItems() && i + 1 <= t)
111        {
112          gen[i - u]->reset();
113          gen[i + 1 - u]->next();
114          values[i + 1]= gen [i + 1 - u]->item();
115          values[i]= 0;
116          return true;
117        }
118        else return false;
119      }
120      int count= 1;
121      int j= i + 1;
122      while (j <= t && count < n)
123      {
124        if (!values [j].isZero())
125          count++;
126        j++;
127      }
128      if (j > t)
129      {
130        if (gen[j - 1 - u]->hasItems())
131        {
132          gen[j - 1 - u]->next();
133          values[j - 1]= gen[j - 1 - u]->item();
134          return true;
135        }
136        int count2= 0;
137        for (int k= j - 2; k >= i; k--)
138        {
139          if (!values[k].isZero() && !values[k + 1].isZero())
140            count2++;
141          if (!values[k].isZero() && !gen[k - u]->hasItems() &&
142              values[k + 1].isZero())
143          {
144            values[k]= 0;
145            gen[k - u]->reset();
146            gen[k - u + 1]->next();
147            values[k + 1]= gen[k - u + 1]->item();
148            if (count2 == 0)
149            {
150              gen[k - u + 2]->reset();
151              gen[k - u + 2]->next();
152              values[k + 2]= gen[k - u + 2]->item();
153            }
154            else
155            {
156              for (int index= 2; index <= count2 + 2 && k + index <= t; index++)
157              {
158                gen[k + index - u]-> reset();
159                gen[k + index - u]->next();
160                values[k + index]= gen[k + index - u]->item();
161              }
162            }
163            for (int index= k + count2 + 3; index <= t; index++)
164            {
165              gen[index - u]->reset();
166              values[index]= 0;
167            }
168            return true;
169          }
170          if (!values[k].isZero() && gen[k - u]->hasItems() &&
171              values[k + 1].isZero())
172          {
173            gen[k - u]->next();
174            values[k]= gen[k - u]->item();
175            gen[k - u + 1]->next();
176            values[k + 1]= gen[k - u + 1]->item();
177            if (count2 > 0)
178            {
179              for (int index= 2; index <= count2 + 1 && k + index <= t; index++)
180              {
181                gen[k + index - u]->reset();
182                gen[k + index - u]->next();
183                values[k + index]= gen[k + index - u]->item();
184              }
185            }
186            for (int index= k + count2 + 2; index <= t; index++)
187            {
188              gen[index - u]->reset();
189              values[index]= 0;
190            }
191            return true;
192          }
193          if (!values[k].isZero() && gen [k - u]->hasItems())
194          {
195            gen[k - u]->next();
196            values[k]= gen[k - u]->item();
197            gen[k - u + 1]->reset();
198            gen[k - u + 1]->next();
199            values[k + 1]= gen[k - u + 1]->item();
200            if (count2 > 0)
201            {
202              for (int index= 2; index <= count2 + 1 && k + index <= t; index++)
203              {
204                gen[k + index - u]->reset();
205                gen[k + index - u]->next();
206                values[k + index]= gen[k + index - u]->item();
207              }
208            }
209            for (int index= k + count2 + 2; index <= t; index++)
210            {
211              gen[index - u]->reset();
212              values[index]= 0;
213            }
214            return true;
215          }
216        }
217      }
218      else
219      {
220        if (gen[j - u - 1]->hasItems())
221        {
222          gen[j - 1 - u]->next();
223          values[j - 1]= gen[j - u - 1]->item();
224        }
225        else
226        {
227          gen[j - u - 1]->reset();
228          gen[j - u]->next();
229          values[j]= gen[j - u]->item();
230          values[j - 1]= 0;
231        }
232        return true;
233      }
234    }
235  }
236  // should never reach this
237  return false;
238}
239
Note: See TracBrowser for help on using the repository browser.