/*****************************************************************************
  FILE           : art_ui.c
  SHORTNAME      : 
  SNNS VERSION   : 3.2

  PURPOSE        : SNNS-Kernel-User-Interface for ART Networks
  NOTES          :

  AUTHOR         : Kai-Uwe Herrmann
  DATE           : 17.05.92

  CHANGED BY     : Sven Doering
  IDENTIFICATION : @(#)art_ui.c	1.8 3/15/94
  SCCS VERSION   : 1.8
  LAST CHANGE    : 3/15/94

             Copyright (c) 1990-1994  SNNS Group, IPVR, Univ. Stuttgart, FRG

******************************************************************************/
#include "kr_typ.h"     /* Global Definitions for User Interface */
#include "kr_ui.h"      /* User Interface - Function Prototypes */

#include "kr_const.h"   /* Global constants for kernel */

#include "glob_typ.h"   /* Global Definitions for User Interface */
#include "kernel.h"

#include "art_typ.h"    /* ART Global Definitions */
#include "kr_art.h"     /* ART Kernel Function Prototypes */
#include "kr_art1.h"
#include "kr_art2.h"
#include "kr_amap.h"
#include "krart_df.h"   /* ART definitions and Macros */
#include "art_ui.h"     /* ART User Interface Function Prototypes */



/* funcname: artui_GetClassifiedStatus ()
   Purpose : Returns the classification status of the actual network
   in-Par  : none
   out-Par : status :   Possible results are:   ART_NO_CLASSIFICATION
                                                ART_CLASSIFIED
                                                ART_NOT_CLASSIFIABLE
                                                ART_DONT_KNOW
   ret_val : krui_err:  Returns an error if no Units defined
*/
krui_err artui_getClassifiedStatus (art_cl_status *status)
{
   krui_err        ret_code           = KRERR_NO_ERROR;

   *status = ART_NO_CLASSIFICATION;

   if (krui_getNoOfUnits() == 0) {
      ret_code = KRERR_NO_UNITS;
      return (ret_code);
   } /*if*/

   /* Check if network has been initialized or update- or learning function
      has been applied to it. If not, we can not know, which type of ART
      network this is, so we return, that there has been no classification.
   */
   if (NetModified) {
      return (ret_code);
   } /*if*/

   switch (TopoSortID) {
   case ART1_TOPO_TYPE:
      if (ART1_CLASSIFIED) {
         *status = ART_CLASSIFIED;
      } else {
         if (ART1_NOT_CLASSIFIABLE) {
            *status = ART_NOT_CLASSIFIABLE;
         } /*if*/
      } /*if*/
      break;
   case ART2_TOPO_TYPE:
      if (ART2_CLASSIFIED) {
         *status = ART_CLASSIFIED;
      } else {
         if (ART2_NOT_CLASSIFIABLE) {
           *status = ART_NOT_CLASSIFIABLE;
         } /*if*/
      } /*if*/
   case ARTMAP_TOPO_TYPE:
      if (ARTMAP_CLASSIFIED) {
         if (kram_AllMapUnitsActive()) {
            *status = ART_DONT_KNOW;
         } else {
            *status = ART_CLASSIFIED;
         } /*if*/
      } else {
         if (ARTMAP_NOT_CLASSIFIABLE) {
            *status = ART_NOT_CLASSIFIABLE;
         } /*if*/
      } /*if*/
   default:
      break;
   } /* switch */

   return (ret_code);
} /* artui_getClassifiedStatus () */




/* funcname: artui_getClassNo ()
   Purpose : Returns the index of the F2-winner-unit
   in-par  : none
   out-par : class_no :  If unit_no is negative, then no winning unit exists.
   ret-val : krui_err :  Returns an error if no Units defined.
*/
krui_err artui_getClassNo (int *class_no)
{
   krui_err       ret_code        = KRERR_NO_ERROR;

   *class_no = -1;

   if (krui_getNoOfUnits () == 0) {
      ret_code = KRERR_NO_UNITS;
      return (ret_code);
   } /*if*/

   /* Check if network has been initialized or update- or learning function
      has been applied to it. If not, we can not know, which type of ART
      network this is, so we return, that there has been no classification.
      If there is a adequate TopoSortID, then we get the no. of the class,
      if there has been a classification.
   */

   if (NetModified) {
      return (ret_code);
   } /*if*/

   switch (TopoSortID) {
   case ART1_TOPO_TYPE:
      if (ART1_CLASSIFIED) {
         *class_no = kra1_getClassNo ();
      } /*if*/
      break;
   case ART2_TOPO_TYPE:
      if (ART2_CLASSIFIED) {
         *class_no = kra2_getClassNo ();
      } /*if*/
   case ARTMAP_TOPO_TYPE:
      if (ARTMAP_CLASSIFIED && (!kram_AllMapUnitsActive())) {
         *class_no = kram_getClassNo ();
      } /*if*/
   default:
      break;
   } /* switch */

   return (ret_code);
} /* artui_getClassNo () */



/* funcname: artui_getN ()
   Purpose : Returns the number of F1-units in an ART1 or ART2 network
   in-par  : none
   out-par : N : number of F1-Units (-1 is returned if not topologically sorted)
   ret-val : krui_err:  Returns an error if no Units defined.
*/
krui_err artui_getN (int *N)
{
   krui_err         ret_code = KRERR_NO_ERROR;

   *N = -1;

   if (krui_getNoOfUnits() == 0) {
      ret_code = KRERR_NO_UNITS;
      return (ret_code);
   } /*if*/

   if (NetModified) {
      return (ret_code);
   } /*if*/

   if ((TopoSortID == ART1_TOPO_TYPE) || (TopoSortID == ART2_TOPO_TYPE)) {
      *N = NoOfInputUnits;
   } /*if*/

   return (ret_code);
} /* artui_getN () */


/* funcname: artui_getM ()
   Purpose : Returns the number of F2-units in an ART1 or ART2 network
   in-par  : none
   out-par : M : number of F2-Units (-1 is returned if not topologically sorted)
   ret-val : krui_err:  Returns an error if no Units defined.
*/
krui_err artui_getM (int *M)
{
   krui_err         ret_code = KRERR_NO_ERROR;

   *M = -1;

   if (krui_getNoOfUnits() == 0) {
      ret_code = KRERR_NO_UNITS;
      return (ret_code);
   } /*if*/

   if (NetModified) {
      return (ret_code);
   } /*if*/

   switch (TopoSortID) {
   case ART1_TOPO_TYPE:
      *M = Art1_NoOfRecUnits;
      break;
   case ART2_TOPO_TYPE:
      *M = Art2_NoOfRecUnits;
      break;
   } /*switch*/

   return (ret_code);
} /* artui_getM () */



/* funcname: artui_getNa ()
   Purpose : Returns the number of F1a-units in an ARTMAP network
   in-par  : none
   out-par : Na: number of F1a-Units (-1 is returned if not topologically sorted)
   ret-val : krui_err:  Returns an error if no Units defined.
*/
krui_err artui_getNa (int *Na)
{
   krui_err         ret_code = KRERR_NO_ERROR;

   *Na = -1;

   if (krui_getNoOfUnits() == 0) {
      ret_code = KRERR_NO_UNITS;
      return (ret_code);
   } /*if*/

   if (NetModified) {
      return (ret_code);
   } /*if*/

   if (TopoSortID == ARTMAP_TOPO_TYPE) {
      *Na = ArtMap_NoOfInpUnits_a;
   } /*if*/

   return (ret_code);
} /* artui_getNa () */




/* funcname: artui_getNb ()
   Purpose : Returns the number of F1b-units in an ARTMAP network
   in-par  : none
   out-par : Nb: number of F1b-Units (-1 is returned if not topologically sorted)
   ret-val : krui_err:  Returns an error if no Units defined.
*/
krui_err artui_getNb (int *Nb)
{
   krui_err         ret_code = KRERR_NO_ERROR;

   *Nb = -1;

   if (krui_getNoOfUnits() == 0) {
      ret_code = KRERR_NO_UNITS;
      return (ret_code);
   } /*if*/

   if (NetModified) {
      return (ret_code);
   } /*if*/

   if (TopoSortID == ARTMAP_TOPO_TYPE) {
      *Nb = ArtMap_NoOfInpUnits_b;
   } /*if*/

   return (ret_code);
} /* artui_getNb () */




/* funcname: artui_getMa ()
   Purpose : Returns the number of F2a-units in an ARTMAP network
   in-par  : none
   out-par : Ma: number of F2a-Units (-1 is returned if not topologically sorted)
   ret-val : krui_err:  Returns an error if no Units defined.
*/
krui_err artui_getMa (int *Ma)
{
   krui_err         ret_code = KRERR_NO_ERROR;

   *Ma = -1;

   if (krui_getNoOfUnits() == 0) {
      ret_code = KRERR_NO_UNITS;
      return (ret_code);
   } /*if*/

   if (NetModified) {
      return (ret_code);
   } /*if*/

   if (TopoSortID == ARTMAP_TOPO_TYPE) {
      *Ma = ArtMap_NoOfRecUnits_a;
   } /*if*/

   return (ret_code);
} /* artui_getMa () */



/* funcname: artui_getMb ()
   Purpose : Returns the number of F2b-units in an ARTMAP network
   in-par  : none
   out-par : Mb: number of F2b-Units (-1 is returned if not topologically sorted)
   ret-val : krui_err:  Returns an error if no Units defined.
*/
krui_err artui_getMb (int *Mb)
{
   krui_err         ret_code = KRERR_NO_ERROR;

   *Mb = -1;

   if (krui_getNoOfUnits() == 0) {
      ret_code = KRERR_NO_UNITS;
      return (ret_code);
   } /*if*/

   if (NetModified) {
      return (ret_code);
   } /*if*/

   if (TopoSortID == ARTMAP_TOPO_TYPE) {
      *Mb = ArtMap_NoOfRecUnits_b;
   } /*if*/

   return (ret_code);
} /* artui_getMb () */
