Changeset 9410:0cea86d25c0b in orange


Ignore:
Timestamp:
12/22/11 00:54:35 (2 years ago)
Author:
janezd <janez.demsar@…>
Branch:
default
Convert:
30dac3cc335262defd045a603bece178589ebb29
Message:

Renamed Domain.classes to Domain.class_vars; now they always exist, but may be empty
Domain's constructor now has a new keyword argument class_vars
ExampleTable now has pickClass for picking a new class and putting the current class attribute to class_vars

Location:
source
Files:
11 edited

Legend:

Unmodified
Added
Removed
  • source/Orange.sln

    r7136 r9410  
    11 
    2 Microsoft Visual Studio Solution File, Format Version 10.00 
    3 # Visual Studio 2008 
    4 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Corn", "corn\Corn.vcproj", "{DB7466D1-CF93-44A1-9AB2-27290A2EC7C7}" 
    5     ProjectSection(ProjectDependencies) = postProject 
    6         {93B854DA-EC3F-4314-B801-58411F9713FD} = {93B854DA-EC3F-4314-B801-58411F9713FD} 
    7         {745880F1-8F10-4247-B481-E4321BC1BD9F} = {745880F1-8F10-4247-B481-E4321BC1BD9F} 
    8     EndProjectSection 
     2Microsoft Visual Studio Solution File, Format Version 11.00 
     3# Visual Studio 2010 
     4Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "corn", "corn\corn.vcxproj", "{DB7466D1-CF93-44A1-9AB2-27290A2EC7C7}" 
    95EndProject 
    10 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Orange", "orange\Orange.vcproj", "{93B854DA-EC3F-4314-B801-58411F9713FD}" 
    11     ProjectSection(ProjectDependencies) = postProject 
    12         {745880F1-8F10-4247-B481-E4321BC1BD9F} = {745880F1-8F10-4247-B481-E4321BC1BD9F} 
    13     EndProjectSection 
     6Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Orange", "orange\Orange.vcxproj", "{93B854DA-EC3F-4314-B801-58411F9713FD}" 
    147EndProject 
    15 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Statc", "statc\Statc.vcproj", "{A0E81B4F-E592-4002-A6BE-5EAA1DD86A25}" 
    16     ProjectSection(ProjectDependencies) = postProject 
    17         {745880F1-8F10-4247-B481-E4321BC1BD9F} = {745880F1-8F10-4247-B481-E4321BC1BD9F} 
    18     EndProjectSection 
     8Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Statc", "statc\Statc.vcxproj", "{A0E81B4F-E592-4002-A6BE-5EAA1DD86A25}" 
    199EndProject 
    20 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "include", "include\include.vcproj", "{745880F1-8F10-4247-B481-E4321BC1BD9F}" 
     10Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "include", "include\include.vcxproj", "{745880F1-8F10-4247-B481-E4321BC1BD9F}" 
    2111EndProject 
    22 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "orangene", "orangene\orangene.vcproj", "{A9DFB98F-8235-4D5B-BFE2-BBCB9A283D98}" 
    23     ProjectSection(ProjectDependencies) = postProject 
    24         {745880F1-8F10-4247-B481-E4321BC1BD9F} = {745880F1-8F10-4247-B481-E4321BC1BD9F} 
    25         {93B854DA-EC3F-4314-B801-58411F9713FD} = {93B854DA-EC3F-4314-B801-58411F9713FD} 
    26     EndProjectSection 
     12Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "orangene", "orangene\orangene.vcxproj", "{A9DFB98F-8235-4D5B-BFE2-BBCB9A283D98}" 
    2713EndProject 
    28 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "orangeom", "orangeom\orangeom.vcproj", "{1DD56474-1110-413B-80B8-707E8EE28EC6}" 
    29     ProjectSection(ProjectDependencies) = postProject 
    30         {93B854DA-EC3F-4314-B801-58411F9713FD} = {93B854DA-EC3F-4314-B801-58411F9713FD} 
    31         {745880F1-8F10-4247-B481-E4321BC1BD9F} = {745880F1-8F10-4247-B481-E4321BC1BD9F} 
    32     EndProjectSection 
     14Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "orangeom", "orangeom\orangeom.vcxproj", "{1DD56474-1110-413B-80B8-707E8EE28EC6}" 
    3315EndProject 
    3416Global 
  • source/_pyxtract.bat

    r8042 r9410  
    11@echo off 
    22cd orange 
     3alias python \python26\python 
    34python ..\pyxtract\defvectors.py 
    45 
  • source/orange/cls_example.cpp

    r9401 r9410  
    598598      const TExample &example = PyExample_AS_ExampleReference(pex); 
    599599      PyObject *list=PyList_New(0); 
    600       if (example.domain->classes) { 
    601           TExample::const_iterator ei=example.values_end; 
    602           const_PITERATE(TVarList, vi, example.domain->classes) { 
    603             PyObject *valo = Value_FromVariableValue(*vi, *ei++); 
    604             PyList_Append(list, valo); 
    605             Py_DECREF(valo); 
    606           } 
     600      TExample::const_iterator ei=example.values_end; 
     601      const_PITERATE(TVarList, vi, example.domain->classVars) { 
     602          PyObject *valo = Value_FromVariableValue(*vi, *ei++); 
     603          PyList_Append(list, valo); 
     604          Py_DECREF(valo); 
    607605      } 
    608606      return list; 
     
    635633          PYERROR(PyExc_TypeError, "list of values expected", PYNULL); 
    636634      } 
    637       if (!example.domain->classes) { 
    638           if (PyList_Size(val) != 0) { 
    639               PYERROR(PyExc_ValueError, "domain does not have multiple classes", PYNULL); 
    640           } 
    641           else { 
    642               RETURN_NONE; 
    643           } 
    644       } 
    645       if (PyList_Size(val) != example.domain->classes->size()) { 
    646           PyErr_Format(PyExc_IndexError, "expected %i values, got %i", example.domain->classes->size(), PyList_Size(val)); 
     635      if (PyList_Size(val) != example.domain->classVars->size()) { 
     636          PyErr_Format(PyExc_IndexError, "expected %i values, got %i", example.domain->classVars->size(), PyList_Size(val)); 
    647637          return NULL; 
    648638      } 
    649639      TExample::iterator ei=example.values_end; 
    650640      int pos = 0; 
    651       const_PITERATE(TVarList, vi, example.domain->classes) { 
     641      const_PITERATE(TVarList, vi, example.domain->classVars) { 
    652642          if (!convertFromPython(PyList_GET_ITEM(val, pos++), *ei++, *vi)) 
    653643              return PYNULL; 
  • source/orange/domain.cpp

    r9401 r9410  
    4343  attributes(mlnew TVarList()), 
    4444  variables(mlnew TVarList()), 
    45   classes(PVarList()), 
     45  classVars(mlnew TVarList()), 
    4646  version(++domainVersion), 
    4747  lastDomain(knownDomains.end()), 
     
    5454  attributes(mlnew TVarList(vl)), 
    5555  variables(mlnew TVarList(vl)), 
    56   classes(PVarList()), 
     56  classVars(mlnew TVarList()), 
    5757  version(++domainVersion), 
    5858  lastDomain(knownDomains.end()), 
     
    6767  attributes(mlnew TVarList(vl)), 
    6868  variables(mlnew TVarList(vl)), 
    69   classes(PVarList()), 
     69  classVars(mlnew TVarList()), 
    7070  version(++domainVersion), 
    7171  lastDomain(knownDomains.end()), 
     
    8282  attributes(mlnew TVarList(old.attributes.getReference())), 
    8383  variables(mlnew TVarList(old.variables.getReference())),  
    84   classes(old.classes ? mlnew TVarList(old.classes.getReference()) : NULL), 
     84  classVars(mlnew TVarList(old.classVars.getReference())), 
    8585  metas(old.metas), 
    8686  version(++domainVersion), 
     
    212212    if (*vi == var) 
    213213      return pos; 
    214   if (classes) 
    215     for(vi = classes->begin(), ve = classes->end(); vi != ve; vi++, pos++) 
    216         if (*vi == var) 
     214  for(vi = classVars->begin(), ve = classVars->end(); vi != ve; vi++, pos++) 
     215      if (*vi == var) 
    217216            return pos; 
    218217 
     
    231230    if ((*vi)->get_name()== name) 
    232231      return pos; 
    233   if (classes) 
    234     for(vi = classes->begin(), ve = classes->end(); vi != ve; vi++, pos++) 
     232  for(vi = classVars->begin(), ve = classVars->end(); vi != ve; vi++, pos++) 
    235233        if ((*vi)->get_name() == name) 
    236234            return pos; 
     
    250248      if (num < variables->size()) 
    251249          return variables->at(num); 
    252  
    253       if (classes && (num - variables->size() < classes->size())) 
    254           return classes->at(num - variables->size()); 
    255  
     250      if (num - variables->size() < classVars->size()) 
     251          return classVars->at(num - variables->size()); 
    256252      if (throwExc) 
    257253        if (!variables->size()) 
     
    284280          return variables->at(num); 
    285281 
    286       if (classes && (num - variables->size() < classes->size())) 
    287           return classes->at(num - variables->size()); 
     282      if (num - variables->size() < classVars->size()) 
     283          return classVars->at(num - variables->size()); 
    288284 
    289285      if (throwExc) 
     
    311307 
    312308PVariable TDomain::getVar(const string &name, bool takeMetas, bool throwExc) 
    313 { PITERATE(TVarList, vi, variables) 
     309{  
     310  PITERATE(TVarList, vi, variables) { 
    314311    if ((*vi)->get_name()==name) 
    315312      return *vi; 
    316   if (classes) { 
    317     PITERATE(TVarList, vi, classes) 
    318     if ((*vi)->get_name()==name) 
    319       return *vi; 
     313  } 
     314  PITERATE(TVarList, vi2, classVars) { 
     315    if ((*vi2)->get_name()==name) 
     316      return *vi2; 
    320317  } 
    321318  if (takeMetas) 
     
    332329 
    333330PVariable TDomain::getVar(const string &name, bool takeMetas, bool throwExc) const 
    334 { const_PITERATE(TVarList, vi, variables) 
     331{ const_PITERATE(TVarList, vi, variables) { 
    335332    if ((*vi)->get_name()==name) 
    336333      return *vi; 
    337   if (classes) { 
    338     const_PITERATE(TVarList, vi, classes) 
    339     if ((*vi)->get_name()==name) 
    340       return *vi; 
     334  } 
     335  const_PITERATE(TVarList, vi2, classVars) { 
     336    if ((*vi2)->get_name()==name) 
     337      return *vi2; 
    341338  } 
    342339 
  • source/orange/domain.hpp

    r9401 r9410  
    6969  PVarList attributes; //PR list of attributes, excluding the class 
    7070  PVarList variables; //PR list of attributes, including the class at the end of the list 
    71   PVarList classes; //PR list of class variables, if multiple; else None 
     71  PVarList classVars; //PR list of class variables, if multiple; else None 
    7272 
    7373  TMetaVector metas; 
  • source/orange/domaindepot.cpp

    r9401 r9410  
    299299 
    300300  if (classDescriptions) { 
    301       newDomain->classes = mlnew TVarList(); 
    302301      PITERATE(TPAttributeDescriptions, ai, classDescriptions) { 
    303           newDomain->classes->push_back(makeVariable(**ai, tStatus, createNewOn)); 
     302          newDomain->classVars->push_back(makeVariable(**ai, tStatus, createNewOn)); 
    304303      } 
    305304  } 
  • source/orange/examples.cpp

    r9401 r9410  
    6060 
    6161  const int attrs = domain->variables->size(); 
    62   const int classes = domain->classes ? domain->classes->size() : 0; 
     62  const int classes = domain->classVars->size(); 
    6363  TValue *vi = values = mlnew TValue[attrs+classes]; 
    6464  values_end = values + attrs; 
     
    6666  PITERATE(TVarList, di, dom->variables) 
    6767    *(vi++) = (*di)->DK(); 
    68   if (dom->classes) { 
    69     PITERATE(TVarList, ci, dom->classes) { 
    70         *(vi++) = (*ci)->DK(); 
    71     } 
     68  PITERATE(TVarList, ci, dom->classVars) { 
     69    *(vi++) = (*ci)->DK(); 
    7270  } 
    7371  if (initMetas) 
     
    105103 
    106104  const int attrs = domain->variables->size(); 
    107   const int classes = domain->classes ? domain->classes->size() : 0; 
     105  const int classes = domain->classVars->size(); 
    108106  values = mlnew TValue[attrs + classes]; 
    109107  values_end = values + attrs; 
     
    160158  if (!dom) 
    161159    raiseError("example needs a domain"); 
    162   if (dom->classes) { 
     160  if (dom->classVars->size()) { 
    163161      raiseError("example merging does not support multiple classes"); 
    164162  } 
    165163 
    166164  const int attrs = domain->variables->size(); 
    167   const int classes = domain->classes ? domain->classes->size() : 0; 
     165  const int classes = domain->classVars->size(); 
    168166  vector<bool> defined(attrs, false); 
    169167 
     
    332330    raiseError("examples are from different domains"); 
    333331 
    334   int Na = domain->variables->size() + (domain->classes ? domain->classes->size() : 0); 
     332  int Na = domain->variables->size() + domain->classVars->size(); 
    335333  if (!Na) 
    336334    return true; 
     
    351349  } 
    352350  else { 
    353       if (domain->classes) { 
    354           Na += domain->classes->size(); 
    355       } 
     351      Na += domain->classVars->size(); 
    356352  } 
    357353  if (!Na) 
     
    376372  } 
    377373  else { 
    378       if (domain->classes) { 
    379           Na += domain->classes->size(); 
    380       } 
     374      Na += domain->classVars->size(); 
    381375  } 
    382376  if (!Na) 
     
    410404  TValue *vli = values; 
    411405  ::addToCRC(crc, domain->variables, vli); 
    412   if (domain->classes) 
    413       ::addToCRC(crc, domain->classes, vli); 
     406  ::addToCRC(crc, domain->classVars, vli); 
    414407   
    415408  if (includeMetas) { 
  • source/orange/lib_kernel.cpp

    r9111 r9410  
    13621362} 
    13631363 
    1364 CONSTRUCTOR_KEYWORDS(Domain, "source") 
     1364CONSTRUCTOR_KEYWORDS(Domain, "source class_vars") 
    13651365 
    13661366PyObject *Domain_new(PyTypeObject *type, PyObject *args, PyObject *keywds) BASED_ON(Orange - Orange.data.Domain, "(list-of-attrs | domain [, hasClass | classVar | None] [,domain | list-of-attrs | source=domain])") 
     
    13691369    PyObject *arg1 = PYNULL; 
    13701370    PyObject *arg2 = PYNULL; 
     1371    PyObject *pyclassvars = PYNULL; 
    13711372 
    13721373    if (PyArg_ParseTuple(args, "O|OO", &list, &arg1, &arg2)) { 
    13731374 
    13741375      if (keywds) { 
    1375         if (PyDict_Size(keywds)>1) 
    1376           PYERROR(PyExc_TypeError, "Domain() accepts only one keyword argument ('source')", PYNULL); 
    1377         if (PyDict_Size(keywds)==1) { 
    1378           PyObject *arg3 = PyDict_GetItemString(keywds, "source"); 
    1379           if (!arg3) 
    1380             PYERROR(PyExc_TypeError, "Domain: invalid keywords argument ('source' expected)", PYNULL); 
    1381           if (arg1 && arg2) { 
    1382             PYERROR(PyExc_TypeError, "Domain: too many arguments", PYNULL); 
     1376          PyObject *key, *value; 
     1377          Py_ssize_t pos = 0; 
     1378          while (PyDict_Next(keywds, &pos, &key, &value)) { 
     1379              if (!PyString_Check(key)) { 
     1380                  Py_XDECREF(pyclassvars); 
     1381                  PYERROR(PyExc_TypeError, "keyword argument name must be a string", PYNULL); 
     1382              } 
     1383              if (!strcmp(PyString_AS_STRING(key), "source")) { 
     1384                  if (arg1 && arg2) { 
     1385                      Py_XDECREF(pyclassvars); 
     1386                      PYERROR(PyExc_TypeError, "Domain: too many arguments", PYNULL); 
     1387                  } 
     1388                  Py_INCREF(value); 
     1389                  if (!arg1) { 
     1390                      arg1 = value; 
     1391                  } 
     1392                  else { 
     1393                      arg2 = value; 
     1394                  } 
     1395              } 
     1396              else if (!strcmp(PyString_AS_STRING(key), "class_vars")) { 
     1397                  Py_INCREF(value); 
     1398                  pyclassvars = value; 
     1399              } 
     1400              else { 
     1401                  Py_XDECREF(pyclassvars); 
     1402                  PyErr_Format(PyExc_ValueError, "unexpected keyword argument '%s'", PyString_AS_STRING(key)); 
     1403                  return PYNULL; 
     1404              } 
    13831405          } 
    1384           else 
    1385             if (!arg1) 
    1386               arg1 = arg3; 
    1387             else 
    1388               arg2 = arg3; 
    1389         } 
    1390       } 
    1391  
     1406      } 
    13921407 
    13931408      if (PyOrDomain_Check(list)) { 
    13941409 
    13951410        PDomain dom = PyOrange_AsDomain(list); 
    1396  
    1397         if (arg1) 
     1411        TDomain *newdomain = NULL; 
     1412 
     1413        if (arg1) { 
    13981414          if (PyString_Check(arg1) || PyOrVariable_Check(arg1)) { 
    13991415            PVariable classVar = varFromArg_byDomain(arg1, dom, false); 
    1400             if (!classVar) 
    1401               return PYNULL; 
     1416            if (!classVar) { 
     1417                Py_XDECREF(pyclassvars); 
     1418                return PYNULL; 
     1419            } 
    14021420            TVarList attributes = dom->variables.getReference(); 
    14031421            int vnumint = dom->getVarNum(classVar, false); 
    1404             if (vnumint>=0) 
    1405               attributes.erase(attributes.begin()+vnumint); 
    1406             return WrapNewOrange(mlnew TDomain(classVar, attributes), type); 
     1422            if (vnumint>=0) { 
     1423                attributes.erase(attributes.begin()+vnumint); 
     1424            } 
     1425            newdomain = mlnew TDomain(classVar, attributes); 
    14071426          } 
    14081427          else if (PyInt_Check(arg1) || (arg1==Py_None)) { 
    14091428            TVarList attributes = dom->variables.getReference(); 
    14101429            if (PyObject_IsTrue(arg1)) 
    1411               return WrapNewOrange(CLONE(TDomain, dom), type); 
     1430                newdomain = CLONE(TDomain, dom), type; 
    14121431            else 
    1413               return WrapNewOrange(mlnew TDomain(PVariable(), dom->variables.getReference()), type); 
     1432                newdomain = mlnew TDomain(PVariable(), dom->variables.getReference()); 
    14141433          } 
    1415           else 
    1416             PYERROR(PyExc_TypeError, "Domain: invalid arguments for constructor (I'm unable to guess what you meant)", PYNULL); 
    1417  
    1418         return WrapNewOrange(CLONE(TDomain, dom), type); 
     1434          else { 
     1435              Py_XDECREF(pyclassvars); 
     1436              PYERROR(PyExc_TypeError, "Domain: invalid arguments for constructor (I'm unable to guess what you meant)", PYNULL); 
     1437          } 
     1438        } 
     1439        else { 
     1440           newdomain = CLONE(TDomain, dom); 
     1441        } 
     1442        if (pyclassvars) { 
     1443            if (!varListFromVarList(pyclassvars, dom->variables, newdomain->classVars.getReference(), false, false)) { 
     1444                Py_DECREF(pyclassvars); 
     1445                mldelete newdomain; 
     1446                return PYNULL; 
     1447            } 
     1448            Py_DECREF(pyclassvars); 
     1449        } 
     1450        return WrapNewOrange(newdomain, type); 
    14191451      } 
    14201452 
     
    14701502      } 
    14711503 
    1472       return WrapNewOrange(mlnew TDomain(classVar, variables), type); 
     1504      TDomain *newdomain = mlnew TDomain(classVar, variables); 
     1505      if (pyclassvars) { 
     1506          if (!varListFromVarList(pyclassvars, source, newdomain->classVars.getReference(), false, false)) { 
     1507              Py_DECREF(pyclassvars); 
     1508              mldelete newdomain; 
     1509              return PYNULL; 
     1510          } 
     1511          Py_DECREF(pyclassvars); 
     1512      } 
     1513      return WrapNewOrange(newdomain, type); 
    14731514    } 
    14741515 
     
    42354276} 
    42364277 
     4278PyObject *ExampleTable_pickClass(TPyOrange *self, PyObject *obj) PYARGS(METH_O, "(Variable | name) -> None") 
     4279{ 
     4280    PyTRY 
     4281        CAST_TO(TExampleTable, table); 
     4282        if (!table->ownsExamples) { 
     4283            PYERROR(PyExc_TypeError, "tables containing references to examples cannot change domain", PYNULL); 
     4284        } 
     4285        PVariable newClass; 
     4286        if (PyString_Check(obj)) { 
     4287            const char *attr = PyString_AS_STRING(obj); 
     4288            TVarList::const_iterator mci(table->domain->classVars->begin()), mce(table->domain->classVars->end()); 
     4289            for(; (mci != mce) && ((*mci)->get_name() != attr); mci++); 
     4290            if (mci == mce) { 
     4291                PYERROR(PyExc_TypeError, "table does not have multiple classes", PYNULL); 
     4292            } 
     4293            newClass = *mci; 
     4294        } 
     4295        if (PyOrVariable_Check(obj)) { 
     4296            newClass = PyOrange_AsVariable(obj); 
     4297        } 
     4298        else if (obj != Py_None) { 
     4299            PYERROR(PyExc_TypeError, "class should be given as Variable, name or None", PYNULL); 
     4300        } 
     4301        table->pickClass(newClass); 
     4302        RETURN_NONE; 
     4303    PyCATCH; 
     4304} 
     4305 
     4306 
    42374307 
    42384308PyObject *ExampleTable_hasMissingValues(TPyOrange *self) PYARGS(0, "() -> bool") 
  • source/orange/tabdelim.cpp

    r9403 r9410  
    147147          else if (classPoses && (cp != ce) && (pos == *cp)) { 
    148148              const int ind = cp - cb; 
    149               domain->classes->at(ind)->filestr2val(valstr, exam.values_end[ind], exam); 
     149              domain->classVars->at(ind)->filestr2val(valstr, exam.values_end[ind], exam); 
    150150              cp++; 
    151151          } 
     
    184184  else if (classPoses && (cp != ce) && (pos == *cp)) { 
    185185    const int ind = cp - cb; 
    186     domain->classes->at(ind)->filestr2val(ai==atoms.end() ? "?" : *(ai++), exam.values_end[ind], exam); 
     186    domain->classVars->at(ind)->filestr2val(ai==atoms.end() ? "?" : *(ai++), exam.values_end[ind], exam); 
    187187  } 
    188188 
  • source/orange/table.cpp

    r7665 r9410  
    683683 
    684684 
     685void TExampleTable::pickClass(PVariable classVar) 
     686{ 
     687    if (!ownsExamples) { 
     688        raiseError("Cannot change the class in a table of references"); 
     689    } 
     690    const int attrs = domain->attributes->size(); 
     691    const int classes = domain->classVars->size(); 
     692    TDomain *newDomain; 
     693    int classPos; 
     694    int end_off = 0; 
     695    if (!classVar) { 
     696        if (!classes) { 
     697            return; 
     698        } 
     699        end_off = -1; 
     700        newDomain = mlnew TDomain(classVar, domain->attributes.getReference()); // No class 
     701        newDomain->classVars->push_back(domain->classVar); 
     702        PITERATE(TVarList, ci, domain->classVars) { 
     703            if (*ci != classVar) { 
     704                newDomain->classVars->push_back(*ci); 
     705            } 
     706        } 
     707        classPos = attrs; 
     708    } 
     709    else { 
     710        classPos = attrs; 
     711        if (domain->classVar) { 
     712            classPos += 1; 
     713        } 
     714        else { 
     715            end_off += 1; 
     716        } 
     717        TVarList::const_iterator mci(domain->classVars->begin()), mce(domain->classVars->end()); 
     718        for(; (mci != mce) && (*mci != classVar); ++mci, ++classPos); 
     719        if (mci == mce) { 
     720            raiseError("Domain has no class %s", classVar->get_name()); 
     721        } 
     722        newDomain = mlnew TDomain(classVar, domain->attributes.getReference()); 
     723        newDomain->classVars = mlnew TVarList(); 
     724        PITERATE(TVarList, ci, domain->classVars) { 
     725            if (*ci == classVar) { 
     726                if (domain->classVar) { 
     727                    newDomain->classVars->push_back(domain->classVar); 
     728                } 
     729            } 
     730            else { 
     731                newDomain->classVars->push_back(*ci); 
     732            } 
     733        } 
     734    } 
     735    ITERATE(TMetaVector, mi, domain->metas) { 
     736        newDomain->metas.push_back(*mi); 
     737    } 
     738    PDomain wdomain = newDomain; 
     739    domain = wdomain; 
     740    for(TExample **ri = examples; ri != _Last; ri++) { 
     741        (**ri).domain = wdomain; 
     742        if (classPos != attrs) { 
     743            TValue t = (**ri).values[attrs]; 
     744            (**ri).values[attrs] = (**ri).values[classPos]; 
     745            (**ri).values[classPos] = t; 
     746        } 
     747        (**ri).values_end += end_off; 
     748    } 
     749} 
     750 
    685751void TExampleTable::addMetaAttribute(const int &id, const TValue &value) 
    686752{  
  • source/orange/table.hpp

    r7800 r9410  
    8484 
    8585  virtual void changeDomain(PDomain, bool filterMetas = false); 
     86  virtual void pickClass(PVariable); 
    8687 
    8788protected: 
Note: See TracChangeset for help on using the changeset viewer.