| /******************************************
  Mosel NI Examples
  =================
  File solarray.c
  ```````````````
  Example module providing the procedure
    solarray(array of mpvar, array of real)
  for getting solutions into an array.
  (c) 2008 Fair Isaac Corporation
      author: S. Heipcke, 2002
*******************************************/
#include 
#include "xprm_ni.h"
#define MAXDIM 20            /* Max. number of array dimensions */
/**** Function prototypes ****/
static int ar_getsol(mm_context ctx,void *libctx);
/**** Structures for passing info to Mosel ****/
/* Subroutines */
static mm_dsofct tabfct[]=
    {
     {"solarray",1000,XPRM_TYP_NOT,2,"A.vA.r",ar_getsol}
    };
	
/* Interface structure */
static XPRMdsointer dsointer= 
    { 
     0,NULL, sizeof(tabfct)/sizeof(XPRMdsofct),tabfct, 0,NULL, 0,NULL
    };
/**** Structures used by this module ****/
static XPRMnifct mm;         /* For storing Mosel NI function table */
/*******************************************************/
/* Initialize the module library just after loading it */
/*******************************************************/
DSO_INIT solarray_init(XPRMnifct nifct, int *interver,int *libver, XPRMdsointer **interf)
{
 mm=nifct;                  /* Save the table of Mosel NI functions */
 *interver=XPRM_NIVERS;     /* Mosel NI version */
 *libver=XPRM_MKVER(0,0,1); /* Module version */
 *interf=&dsointer;         /* Pass info about module contents to Mosel */
 return 0;
}
/***************************/
/* Solution array function */
/***************************/
static int ar_getsol(XPRMcontext ctx,void *libctx)
{
 XPRMarray varr, solarr;
 XPRMset sets1[MAXDIM],sets2[MAXDIM];
 XPRMmpvar var;
 int dim, indices[MAXDIM], i;
/* Get variable and solution arrays from stack in the order that they are
   used as parameters for `getsol' */
 varr=XPRM_POP_REF(ctx);
 solarr=XPRM_POP_REF(ctx);
/* Compare sizes */
 dim = mm->getarrdim(varr);
 if(dim!=mm->getarrdim(solarr))
 {
  mm->dispmsg(ctx,"Solarray: Arrays have different number of dimensions.\n");
  return XPRM_RT_ERROR;
 }
 if(dim>MAXDIM)
 {
  mm->dispmsg(ctx,"Solarray: Maximum number of dimensions exceeded.\n");
  return XPRM_RT_ERROR;
 } 
/* Get the index sets */
 mm->getarrsets(varr,sets1);
 mm->getarrsets(solarr,sets2);
 for(i=0;idispmsg(ctx,"Solarray: Arrays have different index sets.\n");
   return XPRM_RT_ERROR;
  }
 
/* Get solution for all variables: since this uses the ...truentry functions,
   there is no need for any further testing */
 if(!mm->getfirstarrtruentry(varr,indices))
  do
  {
   mm->getarrval(varr,indices,&var);
   mm->setarrvalreal(ctx,solarr,indices,mm->getvsol(ctx,var));
  } while(!mm->getnextarrtruentry(varr,indices));
 return XPRM_RT_OK;
}
 |