[BACK]Return to tree.c CVS log [TXT][DIR] Up to [local] / OpenXM / src / kan96xx / Kan / Kclass

File: [local] / OpenXM / src / kan96xx / Kan / Kclass / tree.c (download)

Revision 1.4, Mon Nov 24 08:16:13 2003 UTC (20 years, 7 months ago) by takayama
Branch: MAIN
Changes since 1.3: +8 -3 lines

The first version of the data translater between OpenXM CMO and polymake.

Example:

$polymake.data(polymake.POINTS([[1,0,0],[1,1,0],[1,0,1],[1,1,1],[1,2,0]]),polymake.FACETS([[1,0,-1],[0,1,0],[2,-1,-1],[0,0,1]]),polymake.AFFINE_HULL(),polymake.N_FACETS([[4]]),polymake.VERTICES([[1,0,0],[1,0,1],[1,1,1],[1,2,0]]),polymake.VERTICES_IN_FACETS([[1,2],[0,1],[2,3],[0,3]]),polymake.AMBIENT_DIM([[2]]),polymake.BOUNDED(),polymake.GRAPH([[1,3],[0,2],[1,3],[0,2]]),polymake.DUAL_GRAPH([[1,2],[0,3],[0,3],[1,2]]));$ /pstr set
[(parse) (ox.sm1) pushfile] extension
k0connectr
oxk0.ccc ( polymake=Object; ) oxexecutestring
oxk0.ccc ( QuoteMode(1); ) oxexecutestring
oxk0.ccc pstr oxexecutestring
oxk0.ccc oxpopcmo /ptree set
oxk0.ccc ( QuoteMode(0); ) oxexecutestring
[(treeToPolymake) ptree] extension /ss set
ss message

/* $OpenXM: OpenXM/src/kan96xx/Kan/Kclass/tree.c,v 1.4 2003/11/24 08:16:13 takayama Exp $ */
#include <stdio.h>
#include "../datatype.h"
#include "../stackm.h"
#include "../extern.h"
#include "../gradedset.h"
#include "../extern2.h"
#include "../kclass.h"



/* Data conversion function : see KclassDataConversion*/
struct object KpoTree(struct object ob) {
  struct object rob;
  struct object ob1,ob2,ob3;
  struct object *newobp;
  rob.tag = Sclass;
  rob.lc.ival = CLASSNAME_tree;
  newobp = (struct object *) sGC_malloc(sizeof(struct object));
  if (newobp == NULL) errorKan1("%s\n","Kclass/indeterminate.c, no more memory.");
  if (ob.tag != Sarray) {
    errorKan1("%s\n","Kclass/indeterminate.c, only properly formatted list object can be transformed into tree. [name, attr-list, arglist].");
  }
  if (getoaSize(ob) < 3) {
    errorKan1("%s\n","Kclass/indeterminate.c, the length must 3 or more than 3. [name, attr-list, arglist].");
  }
  ob1 = getoa(ob,0); ob2 = getoa(ob,1); ob3 = getoa(ob,2);
  if (ob1.tag != Sdollar || ob2.tag != Sarray || ob3.tag != Sarray) {
    errorKan1("%s\n","Kclass/indeterminate.c, [string name, list attributes, list arglist].");
  }
  *newobp = ob;   /* Add class-tag to the array */
  rob.rc.voidp = newobp;
  return(rob);
}


/* Printing function : see fprintClass */
void fprintTree(FILE *fp,struct object op)
{
  printObject(KopTree(op),0,fp);
}

int isTreeAdd(struct object ob) {
  struct object name;
  if (ob.tag != Sclass) {
    return(0);
  }
  if (ectag(ob) != CLASSNAME_tree) {
    return(0);
  }
  ob = KopTree(ob);
  if (ob.tag != Sarray) {
    errorKan1("%s\n","CLASSNAME_tree is broken. Should be array.");
  }
  name = getoa(ob,0);
  if (name.tag != Sdollar) {
    errorKan1("%s\n","CLASSNAME_tree is broken. Should be string.");
  }
  if (strcmp(KopString(name),"add") == 0) {
    return(1);
  }else{
    return(0);
  }
}

struct object addTree(struct object ob1, struct object ob2)
{
  struct object rob,aob;
  struct object ob3,ob4;
  int i;
  if (isTreeAdd(ob1) && !isTreeAdd(ob2)) {
    ob1 = KopTree(ob1);
    ob3 = getoa(ob1,2);
    aob = newObjectArray(getoaSize(ob3)+1);
    for (i=0; i<getoaSize(ob3); i++) {
      putoa(aob,i,getoa(ob3,i));
    }
    putoa(aob,getoaSize(ob3),ob2);
  }else if (!isTreeAdd(ob1) && isTreeAdd(ob2)) {
    ob2 = KopTree(ob2);
    ob3 = getoa(ob2,2);
    aob = newObjectArray(getoaSize(ob3)+1);
    putoa(aob,0,ob1);
    for (i=0; i<getoaSize(ob3); i++) {
      putoa(aob,1+i,getoa(ob3,i));
    }
  }else if (isTreeAdd(ob1) && isTreeAdd(ob2)) {
    ob1 = KopTree(ob1);
    ob2 = KopTree(ob2);
    ob3 = getoa(ob1,2);
    ob4 = getoa(ob2,2);
    aob = newObjectArray(getoaSize(ob3)+getoaSize(ob4));
    for (i=0; i<getoaSize(ob3); i++) {
      putoa(aob,i,getoa(ob3,i));
    }
    for (i=0; i<getoaSize(ob4); i++) {
      putoa(aob,getoaSize(ob3)+i,getoa(ob4,i));
    }
  }else{
    aob = newObjectArray(2);
    putoa(aob,0,ob1);
    putoa(aob,1,ob2);
  }
  rob = newObjectArray(3);
  putoa(rob,0,KpoString("add"));
  putoa(rob,1,KpoString("basic"));
  putoa(rob,2,aob);
  return(KpoTree(rob));
}

/* XML DOM-like interfaces */
struct object KtreeGetDocumentElement(struct object to) {
  struct object rob;
  struct object ob;
  if (to.tag != Sclass) errorKan1("%s\n","KtreeGetDocumentElement");
  if (ectag(to) != CLASSNAME_tree) errorKan1("%s\n","KtreeGetDocumentElement");
  ob = KopTree(to);
  if (ob.tag != Sarray) errorKan1("%s\n","KtreeGetDocumentElement: not an array.");
  if (getoaSize(ob) != 3) errorKan1("%s\n","KtreeGetDocumentElement: array is broken.");
  ob=getoa(ob,0);
  if (ob.tag != Sdollar) errorKan1("%s\n","KtreeGetDocumentElement: element must be a string");
  return ob;
}

struct object KtreeGetAttributes(struct object to) {
  struct object rob;
  struct object ob;
  if (to.tag != Sclass) errorKan1("%s\n","KtreeGetAttributes:");
  if (ectag(to) != CLASSNAME_tree) errorKan1("%s\n","KtreeGetAttributes:");
  ob = KopTree(to);
  if (ob.tag != Sarray) errorKan1("%s\n","KtreeGetAttributes: not an array.");
  if (getoaSize(ob) != 3) errorKan1("%s\n","KtreeGetAttributes: array is broken.");
  return getoa(ob,1);
}

struct object KtreeGetChildNodes(struct object to) {
  struct object rob;
  struct object ob;
  if (to.tag != Sclass) errorKan1("%s\n","KtreeGetChildNodes:");
  if (ectag(to) != CLASSNAME_tree) errorKan1("%s\n","KtreeGetChildNodes:");
  ob = KopTree(to);
  if (ob.tag != Sarray) errorKan1("%s\n","KtreeGetChildNodes: not an array.");
  if (getoaSize(ob) != 3) errorKan1("%s\n","KtreeGetChildNodes: array is broken.");
  return getoa(ob,2);
}

struct object KtreeCreateElement(struct object ostr) {
  struct object ob;
  if (ostr.tag != Sdollar) errorKan1("%s\n","KtreeCreateElement: not a string.");
  ob = newObjectArray(3);
  getoa(ob,0)=ostr;
  getoa(ob,1) = newObjectArray(0);
  getoa(ob,2) = newObjectArray(0);
  return KpoTree(ob);
}