Changeset 66a322 in git for Singular/iparith.cc


Ignore:
Timestamp:
Feb 1, 2010, 11:39:46 AM (14 years ago)
Author:
Frank Seelisch <seelisch@…>
Branches:
(u'spielwiese', 'fe61d9c35bf7c61f2b6cbf1b56e25e2f08d536cc')
Children:
8361387586493cc88d13e1a0d60ee25bf4b70cb3
Parents:
835604146a3a1dabecdf5653b203f926bfc98aa1
Message:
extended syntax for minor command

git-svn-id: file:///usr/local/Singular/svn/trunk@12487 2c84dea3-7e68-4137-9b89-c4e89433aadc
File:
1 edited

Legend:

Unmodified
Added
Removed
  • Singular/iparith.cc

    r835604 r66a322  
    5656#include "walkProc.h"
    5757#include "mod_raw.h"
     58#include "MinorInterface.h"
    5859#ifdef HAVE_FACTORY
    5960#include "clapsing.h"
     
    317318  { "memory",      0, MEMORY_CMD ,        CMD_1},
    318319  { "minbase",     0, MINBASE_CMD ,       CMD_1},
    319   { "minor",       0, MINOR_CMD ,         CMD_23},
     320  { "minor",       0, MINOR_CMD ,         CMD_M},
    320321  { "minres",      0, MINRES_CMD ,        CMD_1},
    321322  { "mod",         0, INTMOD_CMD ,        MULDIV_OP},
     
    25522553  WerrorS("load(\"libname\" [,\"with\"]);");
    25532554  return TRUE;
    2554 }
    2555 static BOOLEAN jjMINOR(leftv res, leftv u, leftv v)
    2556 {
    2557   res->data = (char *)idMinors((matrix)u->Data(),(int)(long)v->Data());
    2558   return (res->data==NULL);
    25592555}
    25602556static BOOLEAN jjMODULO(leftv res, leftv u, leftv v)
     
    36003596,{jjLOAD_E,    LOAD_CMD,       NONE,           STRING_CMD, STRING_CMD, ALLOW_PLURAL |ALLOW_RING}
    36013597,{jjRES,       LRES_CMD,       RESOLUTION_CMD, IDEAL_CMD,  INT_CMD, NO_PLURAL |NO_RING}
    3602 ,{jjMINOR,     MINOR_CMD,      IDEAL_CMD,      MATRIX_CMD, INT_CMD, NO_PLURAL |ALLOW_RING}
    36033598,{jjCALL2MANY, MODUL_CMD,      MODUL_CMD,      DEF_CMD,    DEF_CMD, ALLOW_PLURAL |ALLOW_RING}
    36043599,{jjMODULO,    MODULO_CMD,     MODUL_CMD,      IDEAL_CMD,  IDEAL_CMD, ALLOW_PLURAL |ALLOW_RING}
     
    59595954  return FALSE;
    59605955}
    5961 static BOOLEAN jjMINOR3(leftv res, leftv u, leftv v, leftv w)
    5962 {
    5963   assumeStdFlag(w);
    5964   res->data = (char *)idMinors(
    5965                         (matrix)u->Data(),(int)(long)v->Data(),(ideal)w->Data());
     5956static BOOLEAN currRingIsOverIntegralDomain ()
     5957{
     5958  /* true for fields and Z, false otherwise */
     5959  if (rField_is_Ring_PtoM()) return FALSE;
     5960  if (rField_is_Ring_2toM()) return FALSE;
     5961  if (rField_is_Ring_ModN()) return FALSE;
     5962  return TRUE;
     5963}
     5964static BOOLEAN jjMINOR_M(leftv res, leftv v)
     5965{
     5966  /* Here's the use pattern for the minor command:
     5967        minor ( matrix_expression m, int_expression minorSize,
     5968                optional ideal_expression IasSB, optional int_expression k,
     5969                optional string_expression algorithm,
     5970                optional int_expression cachedMinors,
     5971                optional int_expression cachedMonomials )
     5972     This method here assumes that there are at least two arguments.
     5973     - If IasSB is present, it must be a std basis. All minors will be
     5974       reduced w.r.t. IasSB.
     5975     - If k is absent, all non-zero minors will be computed.
     5976       If k is present and k > 0, the first k non-zero minors will be
     5977       computed.
     5978       If k is present and k < 0, the first |k| minors (some of which
     5979       may be zero) will be computed.
     5980       If k is present and k = 0, an error is reported.
     5981     - If algorithm is absent, all the following arguments must be absent too.
     5982       In this case, a heuristic picks the best-suited algorithm (among
     5983       Bareiss, Laplace, and Laplace with caching).
     5984       If algorithm is present, it must be one of "Bareiss", "bareiss",
     5985       "Laplace", "laplace", "Cache", "cache". In the cases "Cache" and
     5986       "cache" two more arguments are expected, determining how many entries
     5987       the cache may have at most, and how many cached monomials there are at
     5988       most. (Cached monomials are counted over all cached polynomials.)
     5989  */
     5990  const matrix m = (const matrix)v->Data();
     5991  const int mk = (const int)(long)v->next->Data();
     5992  bool noIdeal = true; bool noK = true; bool noAlgorithm = true;
     5993  bool noCacheMinors = true; bool noCacheMonomials = true;
     5994  ideal IasSB; int k; char* algorithm; int cacheMinors; int cacheMonomials;
     5995 
     5996  /* here come the different cases of correct argument sets */
     5997  if ((v->next->next != NULL) && (v->next->next->Typ() == IDEAL_CMD))
     5998  {
     5999    IasSB = (ideal)v->next->next->Data();
     6000    noIdeal = false;
     6001    if ((v->next->next->next != NULL) && (v->next->next->next->Typ() == INT_CMD))
     6002    {
     6003      k = (int)(long)v->next->next->next->Data();
     6004      noK = false;
     6005      assume(k != 0);
     6006      if ((v->next->next->next->next != NULL) && (v->next->next->next->next->Typ() == STRING_CMD))
     6007      {
     6008        algorithm = (char*)v->next->next->next->next->Data();
     6009        noAlgorithm = false;
     6010        if ((v->next->next->next->next->next != NULL) && (v->next->next->next->next->next->Typ() == INT_CMD))
     6011        {
     6012          cacheMinors = (int)(long)v->next->next->next->next->next->Data();
     6013          noCacheMinors = false;
     6014          if ((v->next->next->next->next->next->next != NULL) && (v->next->next->next->next->next->next->Typ() == INT_CMD))
     6015          {
     6016            cacheMonomials = (int)(long)v->next->next->next->next->next->next->Data();
     6017            noCacheMonomials = false;
     6018          }
     6019        }
     6020      }
     6021    }
     6022  }
     6023  else if ((v->next->next != NULL) && (v->next->next->Typ() == INT_CMD))
     6024  {
     6025    k = (int)(long)v->next->next->Data();
     6026    noK = false;
     6027    assume(k != 0);
     6028    if ((v->next->next->next != NULL) && (v->next->next->next->Typ() == STRING_CMD))
     6029    {
     6030      algorithm = (char*)v->next->next->next->Data();
     6031      noAlgorithm = false;
     6032      if ((v->next->next->next->next != NULL) && (v->next->next->next->next->Typ() == INT_CMD))
     6033      {
     6034        cacheMinors = (int)(long)v->next->next->next->next->Data();
     6035        noCacheMinors = false;
     6036        if ((v->next->next->next->next->next != NULL) && (v->next->next->next->next->next->Typ() == INT_CMD))
     6037        {
     6038          cacheMonomials = (int)(long)v->next->next->next->next->next->Data();
     6039          noCacheMonomials = false;
     6040        }
     6041      }
     6042    }
     6043  }
     6044  else if ((v->next->next != NULL) && (v->next->next->Typ() == STRING_CMD))
     6045  {
     6046    algorithm = (char*)v->next->next->Data();
     6047    noAlgorithm = false;
     6048    if ((v->next->next->next != NULL) && (v->next->next->next->Typ() == INT_CMD))
     6049    {
     6050      cacheMinors = (int)(long)v->next->next->next->Data();
     6051      noCacheMinors = false;
     6052      if ((v->next->next->next->next != NULL) && (v->next->next->next->next->Typ() == INT_CMD))
     6053      {
     6054        cacheMonomials = (int)(long)v->next->next->next->next->Data();
     6055        noCacheMonomials = false;
     6056      }
     6057    }
     6058  }
     6059 
     6060  /* upper case conversion for the algorithm if present */
     6061  if (!noAlgorithm)
     6062  {
     6063    if (strcmp(algorithm, "bareiss") == 0)
     6064      algorithm = "Bareiss";
     6065    if (strcmp(algorithm, "laplace") == 0)
     6066      algorithm = "Laplace";
     6067    if (strcmp(algorithm, "cache") == 0)
     6068      algorithm = "Cache";
     6069  }
     6070
     6071  /* here come some tests */
     6072  if ((!noIdeal) && (!hasFlag(v->next->next, FLAG_STD)))
     6073  {
     6074    WerrorS("Provided ideal is not a standard basis.");
     6075    return TRUE;
     6076  }
     6077  if ((!noK) && (k == 0))
     6078  {
     6079    WerrorS("Provided number of minors to be computed is zero.");
     6080    return TRUE;
     6081  }
     6082  if ((!noAlgorithm) && (strcmp(algorithm, "Bareiss") != 0)
     6083      && (strcmp(algorithm, "Laplace") != 0) && (strcmp(algorithm, "Cache") != 0))
     6084  {
     6085    WerrorS("Expected as algorithm one of 'B/bareiss', 'L/laplace', or 'C/cache'.");
     6086    return TRUE;
     6087  }
     6088  if ((!noAlgorithm) && (strcmp(algorithm, "Bareiss") == 0)
     6089      && (!currRingIsOverIntegralDomain()))
     6090  {
     6091    WerrorS("Bareiss algorithm not defined over coefficient rings with zero divisors.");
     6092    return TRUE;
     6093  }
     6094  if ((!noAlgorithm) && (strcmp(algorithm, "Cache") == 0)
     6095      && (noCacheMinors || noCacheMonomials))
     6096  {
     6097    WerrorS("Expected two more int arguments after algorithm 'C/cache' .");
     6098    return TRUE;
     6099  }
     6100
     6101  /* here come the actual procedure calls */
     6102  if (noAlgorithm)
     6103    res->data = getMinorIdealHeuristic(m, mk, (noK ? 0 : k), (noIdeal ? 0 : IasSB), false);
     6104  else if (strcmp(algorithm, "Cache") == 0)
     6105    res->data = getMinorIdealCache(m, mk, (noK ? 0 : k), (noIdeal ? 0 : IasSB), 3, cacheMinors, cacheMonomials, false);
     6106  else
     6107    res->data = getMinorIdeal(m, mk, (noK ? 0 : k), algorithm, (noIdeal ? 0 : IasSB), false);
     6108  res->rtyp = IDEAL_CMD;
    59666109  return FALSE;
    59676110}
     
    64086551,{jjMATRIX_Mo,      MATRIX_CMD, MATRIX_CMD, MODUL_CMD,  INT_CMD,    INT_CMD, ALLOW_PLURAL |ALLOW_RING}
    64096552,{jjMATRIX_Ma,      MATRIX_CMD, MATRIX_CMD, MATRIX_CMD, INT_CMD,    INT_CMD, ALLOW_PLURAL |ALLOW_RING}
    6410 ,{jjMINOR3,         MINOR_CMD,  IDEAL_CMD,  MATRIX_CMD, INT_CMD,    IDEAL_CMD, NO_PLURAL |ALLOW_RING}
    64116553,{jjCALL3MANY,      MODUL_CMD,  MODUL_CMD,  DEF_CMD,    DEF_CMD,    DEF_CMD, ALLOW_PLURAL |ALLOW_RING}
    64126554#ifdef OLD_RES
     
    72677409,{jjJET4,      JET_CMD,         POLY_CMD,/*or set by p*/ 4  , ALLOW_PLURAL |ALLOW_RING}
    72687410,{jjLIST_PL,   LIST_CMD,        LIST_CMD,           -1      , ALLOW_PLURAL |ALLOW_RING}
     7411,{jjWRONG,     MINOR_CMD,       NONE,               1       , ALLOW_PLURAL |ALLOW_RING}
     7412,{jjMINOR_M,   MINOR_CMD,       IDEAL_CMD,          -2      , ALLOW_PLURAL |ALLOW_RING}
    72697413,{jjCALL1ARG,  MODUL_CMD,       MODUL_CMD,          1       , ALLOW_PLURAL |ALLOW_RING}
    72707414,{jjIDEAL_PL,  MODUL_CMD,       MODUL_CMD,          -1      , ALLOW_PLURAL |ALLOW_RING}
Note: See TracChangeset for help on using the changeset viewer.