aibicom.c

Go to the documentation of this file.
00001 /*************************************************************************
00002 
00003 Aibicom (Asynchronous Interpreter of Binary Commands) is a C
00004 subroutine library for the develpment of binary control applications.
00005 
00006 Copyright (C) 2006-2007 by Jorge Silva
00007 e-mail: jorge.silva@komodoopenlab.com
00008 
00009 This library is free software; you can redistribute it and/or
00010 modify it under the terms of the GNU General Public License
00011 as published by the Free Software Foundation; either version 2
00012 of the License, or (at your option) any later version.
00013 
00014 This program is distributed in the hope that it will be useful,
00015 but WITHOUT ANY WARRANTY; without even the implied warranty of
00016 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00017 GNU General Public License for more details.
00018 
00019 You should have received a copy of the GNU General Public License
00020 along with this program; if not, write to the Free Software
00021 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
00022 
00023 *************************************************************************/
00024 
00025 #include<stdlib.h>
00026 #include<math.h>
00027 
00028 #include "aibicom.h"
00029 
00030 double   *SS_DOMAIN;     
00031 double   *SS_MASK;       
00032 double   *SS_ESTIMATE;   
00033 double   *ESTIMATE;
00034 double   SS_RD1;          
00035 double   SS_RD2;          
00037 int    SS_OUTI;        
00039 void SS_LinSpace(void)
00040 {
00041     int i;
00042 
00043     for (i = 0; i < SS_RES; i++)
00044         SS_DOMAIN[i] = ((((double)i / (SS_RES - 1)) * (SS_RD1)) + SS_MIND1);
00045 }
00046 
00047 double SS_GetD1(int i)
00048 {
00049     return SS_DOMAIN[i];
00050 }
00051 
00052 double SS_GetD2(int i)
00053 {
00054     double tmp;
00055 
00056     tmp = (SS_C * SS_DOMAIN[i]);
00057     while ((tmp > SS_MAXD1) || (tmp < SS_MIND1))
00058         if (tmp >= 0.0)
00059             tmp = tmp - SS_RD1;
00060         else
00061             tmp = tmp + SS_RD1;
00062 
00063     return (((tmp - SS_MIND1) / SS_RD1) * SS_RD2) + SS_MIND2;
00064 }
00065 
00066 void SS_UpdateMask(void)
00067 {
00068     int i;
00069     double s, d, dd1, dd2;
00070 
00071     s = SS_MWIDTH / 2.0;
00072 
00073     for (i = 0; i < SS_RES; i++)
00074     {
00075         /* Calculate distance d to current behavior */
00076         if (SS_2D)
00077         {
00078             dd1 = ((SS_GetD1(i) - SS_GetD1(SS_OUTI)) / SS_RD1);
00079             dd2 = ((SS_GetD2(i) - SS_GetD2(SS_OUTI)) / SS_RD2);
00080             d = sqrt((dd1 * dd1) + (dd2 * dd2));
00081         }
00082         else
00083             d = fabs(SS_GetD1(i) - SS_GetD1(SS_OUTI)) / SS_RD1;
00084 
00085         /* Add new radial masks below */
00086         switch (SS_MTYPE)
00087         {
00088         /* Delta mask */
00089         case 0:
00090             if(i==SS_OUTI)
00091                 SS_MASK[i] = 1;
00092             else
00093                 SS_MASK[i] = 0;
00094             break;
00095         /* Delta mask eliminating coordinate (0,0) at all times */
00096         case 1:
00097             if((i==SS_OUTI) || ((SS_GetD1(i) == 0.0) && (SS_GetD2(i) == 0.0)))
00098                 SS_MASK[i] = 1;
00099             else
00100                 SS_MASK[i] = 0;
00101             break;
00102         /* Linear mask */
00103         case 2:
00104             if (d <= s)
00105                 SS_MASK[i] = 1.0 - (d / s);
00106             else
00107                 SS_MASK[i] = 0.0;
00108             break;
00109 
00110         /* Linear mask eliminating coordinate (0,0) at all times */
00111         case 3:
00112             if (d <= s)
00113                 SS_MASK[i] = 1.0 - (d / s);
00114             else
00115                 SS_MASK[i] = 0.0;
00116             if ((SS_GetD1(i) == 0.0) && (SS_GetD2(i) == 0.0))
00117                 SS_MASK[i] = 1.0;
00118             break;
00119         }
00120     }
00121 }
00122 
00123 int SS_FindMin(double *V)
00124 {
00125     double min;
00126     int i, j, minc, mini, minj;
00127 
00128     /*Find minimum value*/
00129     min = 1.0;
00130     mini = 0;
00131     for (i = 0; i < SS_RES; i++)
00132     {
00133         if (V[i] < min)
00134         {
00135             min = V[i];
00136             mini = i;
00137         }
00138     }
00139 
00140     /*Anchor estimate and count minima*/
00141     minc = 0;
00142     for (i = 0; i < SS_RES; i++)
00143     {
00144         V[i] = V[i] - min;
00145         if (V[i] == 0.0)
00146             minc++;
00147     }
00148 
00149     if (minc > 1) printf("More than 1 minimum found!\n");
00150 
00151 /*
00152     if (minc > 1)
00153     {
00154         printf("More than 1 minimum found!\n");
00155         for (i = 0; i < SS_RES; i++)
00156             printf("%.4f\t",SS_ESTIMATE[i]);
00157         printf("\n");
00158     }
00159 */
00160 
00161     /*Obtain new index*/
00162     if (minc > 1)
00163     {
00164         minj = rand() % minc;
00165         i = -1;
00166         j = -1;
00167         while(j < minj)
00168         {
00169             i++;
00170             if (V[i] == 0.0)
00171                 j++;
00172         }
00173         mini = i; /* Selected minimum */
00174     }
00175 
00176     return mini;
00177 
00178 }
00179 
00180 void SS_Init(void)
00181 {
00182 
00183     int i;
00184 
00185     SS_DOMAIN = malloc(SS_RES * sizeof(double));
00186     SS_MASK = malloc(SS_RES * sizeof(double));
00187     SS_ESTIMATE = malloc(SS_RES * sizeof(double));
00188     ESTIMATE = malloc(SS_RES * sizeof(double));
00189 
00190     SS_RD1 = SS_MAXD1 - SS_MIND1;
00191     SS_RD2 = SS_MAXD2 - SS_MIND2;
00192 
00193     SS_LinSpace();
00194 
00195     /*Initialize Intention Estimate and Mask*/
00196     for (i = 0; i < SS_RES; i++)
00197     {
00198         SS_MASK[i] = 0.0;
00199         if ((SS_GetD1(i) == 0.0) && (SS_GetD2(i) == 0.0) && (SS_MTYPE == 2))
00200             SS_MASK[i] = 1.0;
00201         SS_ESTIMATE[i] = (double)rand() / (RAND_MAX + 1.0);
00202     }
00203 
00204 }
00205 
00206 void SS_ApplyDecay(double *V, double K)
00207 {
00208     int i;
00209 
00210 /*
00211     printf("%.4f\n",Dt);
00212 */
00213 
00214     /*Recursive (viscoelastic) Decay*/
00215     for (i = 0; i < SS_RES; i++)
00216         V[i] = K * V[i];
00217 }
00218 
00219 int SS_IfExecute(void)
00220 {
00221     int i, OUTI;
00222 
00223     for (i = 0; i < SS_RES; i++)
00224         ESTIMATE[i] = SS_ESTIMATE[i];
00225 
00226     /*Apply decay*/
00227     SS_ApplyDecay(ESTIMATE, SS_K);
00228 
00229     /*Apply mask and obtain minimum*/
00230     for (i = 0; i < SS_RES; i++)
00231         ESTIMATE[i] = ESTIMATE[i] + (SS_MASK[i] * (1.0 - ESTIMATE[i]));
00232 
00233     OUTI = SS_FindMin(ESTIMATE);
00234 
00235     return OUTI;
00236 }
00237 
00238 int SS_Execute(void)
00239 {
00240     int i;
00241 
00242         /* Debug: print estimate */
00243 
00244     /*for (i = 0; i < SS_RES; i++)
00245     {
00246         printf("%.4f",SS_ESTIMATE[i]);
00247         if (i == (SS_RES - 1))
00248             printf("\n");
00249         else
00250             printf("\t");
00251     }*/
00252 
00253     /*Apply decay*/
00254     SS_ApplyDecay(SS_ESTIMATE, SS_K);
00255 
00256         /* Debug: print estimate */
00257 
00258     /*for (i = 0; i < SS_RES; i++)
00259     {
00260         printf("%.4f",SS_ESTIMATE[i]);
00261         if (i == (SS_RES - 1))
00262             printf("\n");
00263         else
00264             printf("\t");
00265     }*/
00266 
00267     /*Apply mask and obtain minimum*/
00268     for (i = 0; i < SS_RES; i++)
00269         SS_ESTIMATE[i] = SS_ESTIMATE[i] + (SS_MASK[i] * (1.0 - SS_ESTIMATE[i]));
00270 
00271         /* Debug: print estimate */
00272     /*for (i = 0; i < SS_RES; i++)
00273     {
00274         printf("%.4f",SS_ESTIMATE[i]);
00275         if (i == (SS_RES - 1))
00276             printf("\n");
00277         else
00278             printf("\t");
00279     }*/
00280     SS_OUTI = SS_FindMin(SS_ESTIMATE);
00281 
00282         /* Debug: print estimate */
00283     /*for (i = 0; i < SS_RES; i++)
00284     {
00285         printf("%.4f",SS_ESTIMATE[i]);
00286         if (i == (SS_RES - 1))
00287             printf("\n");
00288         else
00289             printf("\t");
00290     }*/
00291         /*printf("\n");*/
00292 
00293     SS_UpdateMask();
00294 
00295 /* Debug: print mask */
00296 /*
00297     for (i = 0; i < SS_RES; i++)
00298     {
00299         printf("%f",SS_MASK[i]);
00300         if (i == (SS_RES - 1))
00301             printf("\n");
00302         else
00303             printf("\t");
00304     }
00305 */
00306 /* Debug: print estimate */
00307 /*
00308     for (i = 0; i < SS_RES; i++)
00309     {
00310         printf("%.4f",SS_ESTIMATE[i]);
00311         if (i == (SS_RES - 1))
00312             printf("\n");
00313         else
00314             printf("\t");
00315     }
00316 */
00317     return SS_OUTI;
00318 
00319 }
00320 
00321 void SS_Clear(void)
00322 {
00323     free(SS_DOMAIN);
00324     free(SS_MASK);
00325     free(SS_ESTIMATE);
00326     free(ESTIMATE);
00327 }
00328 

Generated on Fri Jan 11 11:11:02 2008 for Aibicom by  doxygen 1.5.1