Computational routine
eng


genintc

File content


/* Modnumlib Scicos interfacing function
 * Copyright (C) 2009-2011 Alan Layec
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public
 * License along with this library; if not, write to the
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 * Boston, MA 02111-1307, USA.
 */
 
/* genintc Scicos Random Integer Generator block
 * Type 4 simulation function ver 1.0 - scilab-3.0
 * 2 Mars 2008 - INRIA - Author : A.Layec
 */

/* REVISION HISTORY :
 * $Log$
 */

#include <stdlib.h>
#include <string.h>
#include "scicos_block4.h"

/*prototype*/
void genintc(scicos_block *block,int flag)
{
    /*Déclaration des variables*/
    void *y;
    void *oz;
    int ot;
    int no;
    int mo;
    int so;
    int seed;
    int *minv,*maxv;
    int *rz;
    int i;
    int rnd_nb,rnd_nbswitch;

    oz = GetOzPtrs(block,2);
    no = GetOzSize(block,2,1);
    mo = GetOzSize(block,2,2);

    minv = GetOparPtrs(block,1);
    maxv = GetOparPtrs(block,2);
    rz   = GetOparPtrs(block,3);

    /*Le flag 1 recopie le vecteur Z dans le vecteur Y*/
    if (flag==1||flag==6) {
      /*Récupération de l'adresse du port de sortie régulier*/
      y=(void *)block->outptr[0];

      so=GetSizeOfOz(block,2);

      memcpy(y,oz,mo*no*so);
    }

    /*Le flag 2 calcul les valeurs ou mots binaires dans Z*/
    else if(flag==2||flag==4) {

      /* init */
      if (flag==4) {
       /* set seed on flag 4 */
       seed=*((int *)GetOzPtrs(block,1));
       srand((unsigned int) seed);
      }

      /* get oz type */
      ot = GetOzType(block,2);

      switch (ot)
      {
       case SCSREAL_N : /*genintd_c(&no,&mo,minv,maxv,&rz,oz);*/
                        for(i=0;i<mo*no;i++) {
                          rnd_nb = rand();
                          switch (rz[i])
                          {
                            case -2 :
                              rnd_nbswitch = rand();
                              if (rnd_nbswitch&1) {
                                *((double *) oz+i) = 1 + (int) ((double) rnd_nb * (maxv[i] - 1 + 1) / (RAND_MAX));
                              }
                              else {
                                *((double *) oz+i) = minv[i] + (int) ((double) rnd_nb * (-1 - minv[i] + 1) / (RAND_MAX));
                              }
                              break;
                            /* return to zero case */
                            default :
                              *((double *) oz+i) = minv[i] + (int) ((double) rnd_nb * (maxv[i] - minv[i] + 1) / (RAND_MAX));
                              break;
                          }
                        }
                        break;

       case SCSCOMPLEX_N :
                        for(i=0;i<mo*no;i++) {
                          switch (rz[i])
                          {
                            case -2 :
                              rnd_nbswitch = rand();
                              if (rnd_nbswitch&1) {
                                rnd_nb = rand();
                                *((double *) oz+i) = 1 + (int) ((double) rnd_nb * (maxv[i] - 1 + 1) / (RAND_MAX));
                                rnd_nb = rand();
                                *((double *) oz+mo*no+i) = 1 + (int) ((double) rnd_nb * (maxv[i] - 1 + 1) / (RAND_MAX));
                              }
                              else {
                                rnd_nb = rand();
                                *((double *) oz+i) = minv[i] + (int) ((double) rnd_nb * (-1 - minv[i] + 1) / (RAND_MAX));
                                rnd_nb = rand();
                                *((double *) oz+mo*no+i) = minv[i] + (int) ((double) rnd_nb * (-1 - minv[i] + 1) / (RAND_MAX));
                              }
                              break;
                            /* return to zero case */
                            default :
                              rnd_nb = rand();
                              *((double *) oz+i) = minv[i] + (int) ((double) rnd_nb * (maxv[i] - minv[i] + 1) / (RAND_MAX));
                              rnd_nb = rand();
                              *((double *) oz+mo*no+i) = minv[i] + (int) ((double) rnd_nb * (maxv[i] - minv[i] + 1) / (RAND_MAX));
                              break;
                          }
                        }
                        break;

       case SCSINT32_N :
                        for(i=0;i<mo*no;i++) {
                          rnd_nb = rand();
                          switch (rz[i])
                          {
                            case -2 :
                              rnd_nbswitch = rand();
                              if (rnd_nbswitch&1) {
                                *((long int *) oz+i) = 1 + (long int) ((double) rnd_nb * (maxv[i] - 1 + 1) / (RAND_MAX));
                              }
                              else {
                                *((long int *) oz+i) = minv[i] + (long int) ((double) rnd_nb * (-1 - minv[i] + 1) / (RAND_MAX));
                              }
                              break;
                            /* return to zero case */
                            default :
                              *((long int *) oz+i) = minv[i] + (long int) ((double) rnd_nb * (maxv[i] - minv[i] + 1) / (RAND_MAX));
                              break;
                          }
                        }
                        break;

       case SCSINT16_N :
                        for(i=0;i<mo*no;i++) {
                          rnd_nb = rand();
                          switch (rz[i])
                          {
                            case -2 :
                              rnd_nbswitch = rand();
                              if (rnd_nbswitch&1) {
                                *((short int *) oz+i) = 1 + (short int) ((double) rnd_nb * (maxv[i] - 1 + 1) / (RAND_MAX));
                              }
                              else {
                                *((short int *) oz+i) = minv[i] + (short int) ((double) rnd_nb * (-1 - minv[i] + 1) / (RAND_MAX));
                              }
                              break;
                            /* return to zero case */
                            default :
                              *((short int *) oz+i) = minv[i] + (short int) ((double) rnd_nb * (maxv[i] - minv[i] + 1) / (RAND_MAX));
                              break;
                          }
                        }
                        break;

       case SCSINT8_N :
                        for(i=0;i<mo*no;i++) {
                          rnd_nb = rand();
                          switch (rz[i])
                          {
                            case -2 :
                              rnd_nbswitch = rand();
                              if (rnd_nbswitch&1) {
                                *((char *) oz+i) = 1 + (char) ((double) rnd_nb * (maxv[i] - 1 + 1) / (RAND_MAX));
                              }
                              else {
                                *((char *) oz+i) = minv[i] + (char) ((double) rnd_nb * (-1 - minv[i] + 1) / (RAND_MAX));
                              }
                              break;
                            /* return to zero case */
                            default :
                              *((char *) oz+i) = minv[i] + (char) ((double) rnd_nb * (maxv[i] - minv[i] + 1) / (RAND_MAX));
                              break;
                          }
                        }
                        break;

       case SCSUINT32_N :
                        for(i=0;i<mo*no;i++) {
                          rnd_nb = rand();
                          switch (rz[i])
                          {
                            case -2 :
                              rnd_nbswitch = rand();
                              if (rnd_nbswitch&1) {
                                *((unsigned long int *) oz+i) = 1 + (unsigned long int) ((double) rnd_nb * (maxv[i] - 1 + 1) / (RAND_MAX));
                              }
                              else {
                                *((unsigned long int *) oz+i) = minv[i] + (unsigned long int) ((double) rnd_nb * (-1 - minv[i] + 1) / (RAND_MAX));
                              }
                              break;
                            /* return to zero case */
                            default :
                              *((unsigned long int *) oz+i) = minv[i] + (unsigned long int) ((double) rnd_nb * (maxv[i] - minv[i] + 1) / (RAND_MAX));
                              break;
                          }
                        }
                        break;

       case SCSUINT16_N :
                        for(i=0;i<mo*no;i++) {
                          rnd_nb = rand();
                          switch (rz[i])
                          {
                            case -2 :
                              rnd_nbswitch = rand();
                              if (rnd_nbswitch&1) {
                                *((unsigned short int *) oz+i) = 1 + (unsigned long int) ((double) rnd_nb * (maxv[i] - 1 + 1) / (RAND_MAX));
                              }
                              else {
                                *((unsigned short int *) oz+i) = minv[i] + (unsigned short int) ((double) rnd_nb * (-1 - minv[i] + 1) / (RAND_MAX));
                              }
                              break;
                            /* return to zero case */
                            default :
                              *((unsigned short int *) oz+i) = minv[i] + (unsigned short int) ((double) rnd_nb * (maxv[i] - minv[i] + 1) / (RAND_MAX));
                              break;
                          }
                        }
                        break;

       case SCSUINT8_N :
                        for(i=0;i<mo*no;i++) {
                          rnd_nb = rand();
                          switch (rz[i])
                          {
                            case -2 :
                              rnd_nbswitch = rand();
                              if (rnd_nbswitch&1) {
                                *((unsigned char *) oz+i) = 1 + (unsigned char) ((double) rnd_nb * (maxv[i] - 1 + 1) / (RAND_MAX));
                              }
                              else {
                                *((unsigned char *) oz+i) = minv[i] + (unsigned char) ((double) rnd_nb * (-1 - minv[i] + 1) / (RAND_MAX));
                              }
                              break;
                            /* return to zero case */
                            default :
                              *((unsigned char *) oz+i) = minv[i] + (unsigned char) ((double) rnd_nb * (maxv[i] - minv[i] + 1) / (RAND_MAX));
                              break;
                          }
                        }
                        break;
      }
    }
}