source: git/Singular/ipconv.cc @ e7d5ef

fieker-DuValspielwiese
Last change on this file since e7d5ef was 61b2e16, checked in by Oleksandr Motsak <motsak@…>, 13 years ago
FIX: bigints <-> numbers
  • Property mode set to 100644
File size: 8.8 KB
Line 
1/****************************************
2*  Computer Algebra System SINGULAR     *
3****************************************/
4/* $Id$ */
5/*
6* ABSTRACT: automatic type conversions
7*/
8
9#include <kernel/mod2.h>
10#include <Singular/tok.h>
11#include <Singular/ipid.h>
12#include <misc/intvec.h>
13#include <misc/options.h>
14#include <omalloc/omalloc.h>
15#include <kernel/febase.h>
16#include <kernel/polys.h>
17#include <kernel/ideals.h>
18#include <Singular/subexpr.h>
19#include <coeffs/numbers.h>
20#include <coeffs/coeffs.h>
21//#include <polys/ext_fields/longalg.h>
22#ifdef HAVE_RINGS
23#include <coeffs/rmodulon.h>
24#include <coeffs/rmodulo2m.h>
25#include <coeffs/rintegers.h>
26#endif
27#include <polys/matpol.h>
28#include <Singular/silink.h>
29#include <kernel/syz.h>
30#include <Singular/attrib.h>
31#include <polys/monomials/ring.h>
32#include <Singular/ipshell.h>
33#include <Singular/ipconv.h>
34
35typedef void *   (*iiConvertProc)(void * data);
36typedef void    (*iiConvertProcL)(leftv out,leftv in);
37struct sConvertTypes
38{
39  int i_typ;
40  int o_typ;
41  iiConvertProc p;
42  iiConvertProcL pl;
43};
44
45// all of these static conversion routines work destructive on their input
46
47static void * iiI2P(void *data)
48{
49  poly p=pISet((int)(long)data);
50  return (void *)p;
51}
52
53static void * iiBI2P(void *data)
54{
55  number n=n_Init_bigint((number)data, coeffs_BIGINT /*currRing->cf*/, currRing->cf);
56  n_Delete((number *)&data, coeffs_BIGINT);
57  poly p=p_NSet(n, currRing);
58  return (void *)p;
59}
60
61static void * iiI2V(void *data)
62{
63  poly p=pISet((int)(long)data);
64  if (p!=NULL) pSetComp(p,1);
65  return (void *)p;
66}
67
68static void * iiBI2V(void *data)
69{
70  number n=n_Init_bigint((number)data, coeffs_BIGINT/*currRing->cf*/, currRing->cf);
71  n_Delete((number *)&data, coeffs_BIGINT);
72  poly p=p_NSet(n, currRing);
73  if (p!=NULL) pSetComp(p,1);
74  return (void *)p;
75}
76
77static void * iiI2Id(void *data)
78{
79  ideal I=idInit(1,1);
80  I->m[0]=pISet((int)(long)data);
81  return (void *)I;
82}
83
84static void * iiBI2Id(void *data)
85{
86  ideal I=idInit(1,1);
87  number n=n_Init_bigint((number)data, coeffs_BIGINT, currRing->cf);
88  n_Delete((number *)&data,coeffs_BIGINT);
89  poly p=pNSet(n);
90  I->m[0]=p;
91  return (void *)I;
92}
93static void * iiP2V(void *data)
94{
95  poly p=(poly)data;
96  if (p!=NULL) pSetCompP(p,1);
97  return (void *)p;
98}
99
100static void * iiP2Id(void *data)
101{
102  ideal I=idInit(1,1);
103
104  I->m[0]=(poly)data;
105  if (data!=NULL)
106  {
107    poly p=(poly)data;
108    if (pGetComp(p)!=0) I->rank=pMaxComp(p);
109  }
110  return (void *)I;
111}
112
113static void * iiV2Ma(void *data)
114{
115  matrix m=(matrix)idVec2Ideal((poly)data);
116  int h=MATCOLS(m);
117  MATCOLS(m)=MATROWS(m);
118  MATROWS(m)=h;
119  m->rank=h;
120  pDelete((poly *)&data);
121  return (void *)m;
122}
123
124static void * iiN2P(void *data);
125
126static void * iiDummy(void *data)
127{
128  return data;
129}
130
131static void * iiMo2Ma(void *data)
132{
133  void *res=id_Module2Matrix((ideal)data,currRing);
134  return res;
135}
136
137static void * iiMa2Mo(void *data)
138{
139  void *res=id_Matrix2Module((matrix)data,currRing);
140  return res;
141}
142
143static void * iiI2Iv(void *data)
144{
145  int s=(int)(long)data;
146  intvec *iv=new intvec(s,s);
147  return (void *)iv;
148}
149
150static void * iiI2N(void *data)
151{
152  number n=nInit((int)(long)data);
153  return (void *)n;
154}
155
156static void * iiI2BI(void *data)
157{
158  number n=n_Init((int)(long)data, coeffs_BIGINT);
159  return (void *)n;
160}
161
162static void * iiBI2N(void *data)
163{
164  if (currRing==NULL) return NULL;
165  // a bigint is really a number from char 0, with diffrent
166  // operations...
167  number n = n_Init_bigint((number)data, coeffs_BIGINT, currRing->cf);
168  n_Delete((number *)&data, coeffs_BIGINT); 
169  return (void*)n;
170}
171
172static void * iiIm2Ma(void *data)
173{
174  int i, j;
175  intvec *iv = (intvec *)data;
176  matrix m = mpNew(iv->rows(), iv->cols());
177
178  for (i=iv->rows(); i>0; i--)
179  {
180    for (j=iv->cols(); j>0; j--)
181    {
182      MATELEM(m, i, j) = pISet(IMATELEM(*iv, i, j));
183    }
184  }
185  delete iv;
186  return (void *)m;
187}
188
189static void * iiN2P(void *data)
190{
191  poly p=NULL;
192  if (!nIsZero((number)data))
193  {
194    p=pNSet((number)data);
195  }
196  //else
197  //{
198  //  nDelete((number *)&data);
199  //}
200  return (void *)p;
201}
202
203static void * iiN2Ma(void *data)
204{
205  ideal I=idInit(1,1);
206  if (!nIsZero((number)data))
207  {
208    poly p=pNSet((number)data);
209    I->m[0]=p;
210  }
211  //else
212  //{
213  //  nDelete((number *)&data);
214  //}
215  return (void *)I;
216}
217
218static void * iiS2Link(void *data)
219{
220  si_link l=(si_link)omAlloc0Bin(ip_link_bin);
221  slInit(l, (char *) data);
222  omFree((ADDRESS)data);
223  return (void *)l;
224}
225
226/*
227static void * iiR2L(void * data)
228{
229  syStrategy tmp=(syStrategy)data;
230  return  (void *)syConvRes(tmp,TRUE);
231}
232*/
233static void iiR2L_l(leftv out, leftv in)
234{
235  int add_row_shift = 0;
236  intvec *weights=(intvec*)atGet(in,"isHomog",INTVEC_CMD);
237  if (weights!=NULL)  add_row_shift=weights->min_in();
238
239  syStrategy tmp=(syStrategy)in->CopyD();
240
241  out->data=(void *)syConvRes(tmp,TRUE,add_row_shift);
242}
243
244static void * iiL2R(void * data)
245{
246  return (void *)syConvList((lists)data,TRUE);
247}
248
249//
250// automatic conversions:
251//
252#define IPCONV
253#define D(A) A
254#include <Singular/table.h>
255/*2
256* try to convert 'input' of type 'inputType' to 'output' of type 'outputType'
257* return FALSE on success
258*/
259BOOLEAN iiConvert (int inputType, int outputType, int index, leftv input, leftv output)
260{
261  memset(output,0,sizeof(sleftv));
262  if ((inputType==outputType)
263  || (outputType==DEF_CMD)
264  || ((outputType==IDHDL)&&(input->rtyp==IDHDL)))
265  {
266    memcpy(output,input,sizeof(*output));
267    memset(input,0,sizeof(*input));
268    return FALSE;
269  }
270  else if (outputType==ANY_TYPE)
271  {
272    output->rtyp=ANY_TYPE;
273    output->data=(char *)input->Typ();
274    /* the name of the object:*/
275    if (input->e==NULL)
276    {
277      if (input->rtyp==IDHDL)
278      /* preserve name: copy it */
279        output->name=omStrDup(IDID((idhdl)(input->data)));
280      else if (input->name!=NULL)
281      {
282        output->name=input->name;
283        input->name=NULL;
284      }
285      else if ((input->rtyp==POLY_CMD) && (input->name==NULL))
286      {
287        if (input->data!=NULL)
288        {
289          int nr=pIsPurePower((poly)input->data);
290          if (nr!=0)
291          {
292            if (pGetExp((poly)input->data,nr)==1)
293            {
294              output->name=omStrDup(currRing->names[nr-1]);
295            }
296            else
297            {
298              char *tmp=(char *)omAlloc(4);
299              sprintf(tmp,"%c%d",*(currRing->names[nr-1]),
300                (int)pGetExp((poly)input->data,nr));
301              output->name=tmp;
302            }
303          }
304          else if(pIsConstant((poly)input->data))
305          {
306            output->name=ndName(pGetCoeff((poly)input->data), currRing->cf);
307          }
308#ifdef TEST
309          else
310          {
311            WerrorS("wrong name, should not happen");
312            output->name=omStrDup("?");
313          }
314#endif
315        }
316      }
317      else if ((input->rtyp==NUMBER_CMD) && (input->name==NULL))
318      {
319        output->name=ndName((number)input->data, currRing->cf);
320      }
321      else
322      {
323        /* no need to preserve name: use it */
324        output->name=input->name;
325        memset(input,0,sizeof(*input));
326      }
327    }
328    output->next=input->next;
329    input->next=NULL;
330    return FALSE;
331  }
332  if (index!=0) /* iiTestConvert does not returned 'failure' */
333  {
334    index--;
335
336    if((dConvertTypes[index].i_typ==inputType)
337    &&(dConvertTypes[index].o_typ==outputType))
338    {
339      if(TEST_V_ALLWARN)
340      {
341        Print("automatic  conversion %s -> %s\n",
342        Tok2Cmdname(inputType),Tok2Cmdname(outputType));
343      }
344      if ((currRing==NULL) && (outputType>BEGIN_RING) && (outputType<END_RING))
345        return TRUE;
346      output->rtyp=outputType;
347      if (dConvertTypes[index].p!=NULL)
348      {
349        output->data=dConvertTypes[index].p(input->CopyD());
350      }
351      else
352      {
353        dConvertTypes[index].pl(output,input);
354      }
355      if ((output->data==NULL)
356      && ((outputType!=INT_CMD)
357        &&(outputType!=POLY_CMD)
358        &&(outputType!=VECTOR_CMD)
359        &&(outputType!=NUMBER_CMD)))
360      {
361        return TRUE;
362      }
363      output->next=input->next;
364      input->next=NULL;
365  //if (outputType==MATRIX_CMD) Print("convert %d -> matrix\n",inputType);
366      return FALSE;
367    }
368  }
369  return TRUE;
370}
371
372/*2
373* try to convert 'inputType' in 'outputType'
374* return 0 on failure, an index (<>0) on success
375*/
376int iiTestConvert (int inputType, int outputType)
377{
378  if ((inputType==outputType)
379  || (outputType==DEF_CMD)
380  || (outputType==IDHDL)
381  || (outputType==ANY_TYPE))
382  {
383    return -1;
384  }
385
386  if ((currRing==NULL) && (outputType>BEGIN_RING) && (outputType<END_RING))
387    return 0;
388
389  // search the list
390  int i=0;
391  while (dConvertTypes[i].i_typ!=0)
392  {
393    if((dConvertTypes[i].i_typ==inputType)
394    &&(dConvertTypes[i].o_typ==outputType))
395    {
396      //Print("test convert %d to %d (%s -> %s):%d\n",inputType,outputType,
397      //Tok2Cmdname(inputType), Tok2Cmdname(outputType),i+1);
398      return i+1;
399    }
400    i++;
401  }
402  //Print("test convert %d to %d (%s -> %s):0\n",inputType,outputType,
403  // Tok2Cmdname(inputType), Tok2Cmdname(outputType));
404  return 0;
405}
Note: See TracBrowser for help on using the repository browser.