📄 lib_kernel.cpp
字号:
/*
This file is part of Orange.
Orange 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.
Orange 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 Orange; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Authors: Janez Demsar, Blaz Zupan, 1996--2002
Contact: janez.demsar@fri.uni-lj.si
*/
/********************************
This file includes constructors and specialized methods for classes defined in project Kernel
*********************************/
#ifdef _MSC_VER
#pragma warning (disable : 4786 4114 4018 4267 4244)
#endif
#include "vars.hpp"
#include "domain.hpp"
#include "examplegen.hpp"
#include "table.hpp"
#include "learn.hpp"
#include "estimateprob.hpp"
#include "preprocessors.hpp"
#include "callback.hpp"
#include "cls_value.hpp"
#include "cls_example.hpp"
#include "lib_kernel.hpp"
#include "vectortemplates.hpp"
#include "externs.px"
#include "converts.hpp"
#include "cls_orange.hpp"
#include "slist.hpp"
WRAPPER(ExampleTable);
/* This was moved from lib_vectors.cpp:
- nobody used it
- lib_vectors.cpp is automatically generated and I'd hate to add this as an exception
int pt_FloatList(PyObject *args, void *floatlist)
{
*(PFloatList *)(floatlist) = PFloatList_FromArguments(args);
return PyErr_Occurred() ? -1 : 0;
}
*/
/* ************ PROGRESS CALLBACK ************ */
#include "progress.hpp"
PyObject *ProgressCallback_new(PyTypeObject *type, PyObject *args, PyObject *keywords) BASED_ON(Orange, "<abstract>")
{ if (type == (PyTypeObject *)&PyOrProgressCallback_Type)
return setCallbackFunction(WrapNewOrange(mlnew TProgressCallback_Python(), type), args);
else
return WrapNewOrange(mlnew TProgressCallback_Python(), type);
}
PyObject *ProgressCallback__reduce__(PyObject *self)
{
return callbackReduce(self, PyOrProgressCallback_Type);
}
PyObject *ProgressCallback_call(PyObject *self, PyObject *targs, PyObject *keywords) PYDOC("(float[, Orange]) -> bool")
{
PyTRY
NO_KEYWORDS
if (PyOrange_OrangeBaseClass(self->ob_type) == &PyOrProgressCallback_Type) {
PyErr_Format(PyExc_SystemError, "ProgressCallback.call called for '%s': this may lead to stack overflow", self->ob_type->tp_name);
return PYNULL;
}
float f;
POrange o;
if (!PyArg_ParseTuple(targs, "f|O&:ProgressCallback", &f, ccn_Orange, &o))
return PYNULL;
return PyInt_FromLong(SELF_AS(TProgressCallback)(f, o) ? 1 : 0);
PyCATCH
}
/* ************ VARIABLE ************ */
PVarList PVarList_FromArguments(PyObject *arg) { return ListOfWrappedMethods<PVarList, TVarList, PVariable, &PyOrVariable_Type>::P_FromArguments(arg); }
PyObject *VarList_FromArguments(PyTypeObject *type, PyObject *arg) { return ListOfWrappedMethods<PVarList, TVarList, PVariable, &PyOrVariable_Type>::_FromArguments(type, arg); }
PyObject *VarList_new(PyTypeObject *type, PyObject *arg, PyObject *kwds) BASED_ON(Orange, "(<list of Variable>)") ALLOWS_EMPTY { return ListOfWrappedMethods<PVarList, TVarList, PVariable, &PyOrVariable_Type>::_new(type, arg, kwds); }
PyObject *VarList_getitem_sq(TPyOrange *self, int index) { return ListOfWrappedMethods<PVarList, TVarList, PVariable, &PyOrVariable_Type>::_getitem(self, index); }
int VarList_setitem_sq(TPyOrange *self, int index, PyObject *item) { return ListOfWrappedMethods<PVarList, TVarList, PVariable, &PyOrVariable_Type>::_setitem(self, index, item); }
PyObject *VarList_getslice(TPyOrange *self, int start, int stop) { return ListOfWrappedMethods<PVarList, TVarList, PVariable, &PyOrVariable_Type>::_getslice(self, start, stop); }
int VarList_setslice(TPyOrange *self, int start, int stop, PyObject *item) { return ListOfWrappedMethods<PVarList, TVarList, PVariable, &PyOrVariable_Type>::_setslice(self, start, stop, item); }
int VarList_len_sq(TPyOrange *self) { return ListOfWrappedMethods<PVarList, TVarList, PVariable, &PyOrVariable_Type>::_len(self); }
PyObject *VarList_richcmp(TPyOrange *self, PyObject *object, int op) { return ListOfWrappedMethods<PVarList, TVarList, PVariable, &PyOrVariable_Type>::_richcmp(self, object, op); }
PyObject *VarList_concat(TPyOrange *self, PyObject *obj) { return ListOfWrappedMethods<PVarList, TVarList, PVariable, &PyOrVariable_Type>::_concat(self, obj); }
PyObject *VarList_repeat(TPyOrange *self, int times) { return ListOfWrappedMethods<PVarList, TVarList, PVariable, &PyOrVariable_Type>::_repeat(self, times); }
PyObject *VarList_str(TPyOrange *self) { return ListOfWrappedMethods<PVarList, TVarList, PVariable, &PyOrVariable_Type>::_str(self); }
PyObject *VarList_repr(TPyOrange *self) { return ListOfWrappedMethods<PVarList, TVarList, PVariable, &PyOrVariable_Type>::_str(self); }
int VarList_contains(TPyOrange *self, PyObject *obj) { return ListOfWrappedMethods<PVarList, TVarList, PVariable, &PyOrVariable_Type>::_contains(self, obj); }
PyObject *VarList_append(TPyOrange *self, PyObject *item) PYARGS(METH_O, "(Variable) -> None") { return ListOfWrappedMethods<PVarList, TVarList, PVariable, &PyOrVariable_Type>::_append(self, item); }
PyObject *VarList_extend(TPyOrange *self, PyObject *obj) PYARGS(METH_O, "(sequence) -> None") { return ListOfWrappedMethods<PVarList, TVarList, PVariable, &PyOrVariable_Type>::_extend(self, obj); }
PyObject *VarList_count(TPyOrange *self, PyObject *obj) PYARGS(METH_O, "(Variable) -> int") { return ListOfWrappedMethods<PVarList, TVarList, PVariable, &PyOrVariable_Type>::_count(self, obj); }
PyObject *VarList_filter(TPyOrange *self, PyObject *args) PYARGS(METH_VARARGS, "([filter-function]) -> VarList") { return ListOfWrappedMethods<PVarList, TVarList, PVariable, &PyOrVariable_Type>::_filter(self, args); }
PyObject *VarList_index(TPyOrange *self, PyObject *obj) PYARGS(METH_O, "(Variable) -> int") { return ListOfWrappedMethods<PVarList, TVarList, PVariable, &PyOrVariable_Type>::_index(self, obj); }
PyObject *VarList_insert(TPyOrange *self, PyObject *args) PYARGS(METH_VARARGS, "(index, item) -> None") { return ListOfWrappedMethods<PVarList, TVarList, PVariable, &PyOrVariable_Type>::_insert(self, args); }
PyObject *VarList_native(TPyOrange *self) PYARGS(METH_NOARGS, "() -> list") { return ListOfWrappedMethods<PVarList, TVarList, PVariable, &PyOrVariable_Type>::_native(self); }
PyObject *VarList_pop(TPyOrange *self, PyObject *args) PYARGS(METH_VARARGS, "() -> Variable") { return ListOfWrappedMethods<PVarList, TVarList, PVariable, &PyOrVariable_Type>::_pop(self, args); }
PyObject *VarList_remove(TPyOrange *self, PyObject *obj) PYARGS(METH_O, "(Variable) -> None") { return ListOfWrappedMethods<PVarList, TVarList, PVariable, &PyOrVariable_Type>::_remove(self, obj); }
PyObject *VarList_reverse(TPyOrange *self) PYARGS(METH_NOARGS, "() -> None") { return ListOfWrappedMethods<PVarList, TVarList, PVariable, &PyOrVariable_Type>::_reverse(self); }
PyObject *VarList_sort(TPyOrange *self, PyObject *args) PYARGS(METH_VARARGS, "([cmp-func]) -> None") { return ListOfWrappedMethods<PVarList, TVarList, PVariable, &PyOrVariable_Type>::_sort(self, args); }
PyObject *VarList__reduce__(TPyOrange *self, PyObject *) { return ListOfWrappedMethods<PVarList, TVarList, PVariable, &PyOrVariable_Type>::_reduce(self); }
PVarListList PVarListList_FromArguments(PyObject *arg) { return ListOfWrappedMethods<PVarListList, TVarListList, PVarList, &PyOrVarList_Type>::P_FromArguments(arg); }
PyObject *VarListList_FromArguments(PyTypeObject *type, PyObject *arg) { return ListOfWrappedMethods<PVarListList, TVarListList, PVarList, &PyOrVarList_Type>::_FromArguments(type, arg); }
PyObject *VarListList_new(PyTypeObject *type, PyObject *arg, PyObject *kwds) BASED_ON(Orange, "(<list of VarList>)") ALLOWS_EMPTY { return ListOfWrappedMethods<PVarListList, TVarListList, PVarList, &PyOrVarList_Type>::_new(type, arg, kwds); }
PyObject *VarListList_getitem_sq(TPyOrange *self, int index) { return ListOfWrappedMethods<PVarListList, TVarListList, PVarList, &PyOrVarList_Type>::_getitem(self, index); }
int VarListList_setitem_sq(TPyOrange *self, int index, PyObject *item) { return ListOfWrappedMethods<PVarListList, TVarListList, PVarList, &PyOrVarList_Type>::_setitem(self, index, item); }
PyObject *VarListList_getslice(TPyOrange *self, int start, int stop) { return ListOfWrappedMethods<PVarListList, TVarListList, PVarList, &PyOrVarList_Type>::_getslice(self, start, stop); }
int VarListList_setslice(TPyOrange *self, int start, int stop, PyObject *item) { return ListOfWrappedMethods<PVarListList, TVarListList, PVarList, &PyOrVarList_Type>::_setslice(self, start, stop, item); }
int VarListList_len_sq(TPyOrange *self) { return ListOfWrappedMethods<PVarListList, TVarListList, PVarList, &PyOrVarList_Type>::_len(self); }
PyObject *VarListList_richcmp(TPyOrange *self, PyObject *object, int op) { return ListOfWrappedMethods<PVarListList, TVarListList, PVarList, &PyOrVarList_Type>::_richcmp(self, object, op); }
PyObject *VarListList_concat(TPyOrange *self, PyObject *obj) { return ListOfWrappedMethods<PVarListList, TVarListList, PVarList, &PyOrVarList_Type>::_concat(self, obj); }
PyObject *VarListList_repeat(TPyOrange *self, int times) { return ListOfWrappedMethods<PVarListList, TVarListList, PVarList, &PyOrVarList_Type>::_repeat(self, times); }
PyObject *VarListList_str(TPyOrange *self) { return ListOfWrappedMethods<PVarListList, TVarListList, PVarList, &PyOrVarList_Type>::_str(self); }
PyObject *VarListList_repr(TPyOrange *self) { return ListOfWrappedMethods<PVarListList, TVarListList, PVarList, &PyOrVarList_Type>::_str(self); }
int VarListList_contains(TPyOrange *self, PyObject *obj) { return ListOfWrappedMethods<PVarListList, TVarListList, PVarList, &PyOrVarList_Type>::_contains(self, obj); }
PyObject *VarListList_append(TPyOrange *self, PyObject *item) PYARGS(METH_O, "(VarList) -> None") { return ListOfWrappedMethods<PVarListList, TVarListList, PVarList, &PyOrVarList_Type>::_append(self, item); }
PyObject *VarListList_extend(TPyOrange *self, PyObject *obj) PYARGS(METH_O, "(sequence) -> None") { return ListOfWrappedMethods<PVarListList, TVarListList, PVarList, &PyOrVarList_Type>::_extend(self, obj); }
PyObject *VarListList_count(TPyOrange *self, PyObject *obj) PYARGS(METH_O, "(VarList) -> int") { return ListOfWrappedMethods<PVarListList, TVarListList, PVarList, &PyOrVarList_Type>::_count(self, obj); }
PyObject *VarListList_filter(TPyOrange *self, PyObject *args) PYARGS(METH_VARARGS, "([filter-function]) -> VarListList") { return ListOfWrappedMethods<PVarListList, TVarListList, PVarList, &PyOrVarList_Type>::_filter(self, args); }
PyObject *VarListList_index(TPyOrange *self, PyObject *obj) PYARGS(METH_O, "(VarList) -> int") { return ListOfWrappedMethods<PVarListList, TVarListList, PVarList, &PyOrVarList_Type>::_index(self, obj); }
PyObject *VarListList_insert(TPyOrange *self, PyObject *args) PYARGS(METH_VARARGS, "(index, item) -> None") { return ListOfWrappedMethods<PVarListList, TVarListList, PVarList, &PyOrVarList_Type>::_insert(self, args); }
PyObject *VarListList_native(TPyOrange *self) PYARGS(METH_NOARGS, "() -> list") { return ListOfWrappedMethods<PVarListList, TVarListList, PVarList, &PyOrVarList_Type>::_native(self); }
PyObject *VarListList_pop(TPyOrange *self, PyObject *args) PYARGS(METH_VARARGS, "() -> VarList") { return ListOfWrappedMethods<PVarListList, TVarListList, PVarList, &PyOrVarList_Type>::_pop(self, args); }
PyObject *VarListList_remove(TPyOrange *self, PyObject *obj) PYARGS(METH_O, "(VarList) -> None") { return ListOfWrappedMethods<PVarListList, TVarListList, PVarList, &PyOrVarList_Type>::_remove(self, obj); }
PyObject *VarListList_reverse(TPyOrange *self) PYARGS(METH_NOARGS, "() -> None") { return ListOfWrappedMethods<PVarListList, TVarListList, PVarList, &PyOrVarList_Type>::_reverse(self); }
PyObject *VarListList_sort(TPyOrange *self, PyObject *args) PYARGS(METH_VARARGS, "([cmp-func]) -> None") { return ListOfWrappedMethods<PVarListList, TVarListList, PVarList, &PyOrVarList_Type>::_sort(self, args); }
PyObject *VarListList__reduce__(TPyOrange *self, PyObject *) { return ListOfWrappedMethods<PVarListList, TVarListList, PVarList, &PyOrVarList_Type>::_reduce(self); }
PVarList knownVars(PyObject *keywords)
{
PVarList variables;
PyObject *pyknownVars=keywords ? PyDict_GetItemString(keywords, "use") : PYNULL;
if (!pyknownVars || (pyknownVars == Py_None))
return PVarList();
if (PyOrVarList_Check(pyknownVars))
variables = ((GCPtr<TVarList>)(PyOrange_AS_Orange(pyknownVars)));
else if (PyOrDomain_Check(pyknownVars)) {
PDomain domain = PyOrange_AsDomain(pyknownVars);
variables = mlnew TVarList(domain->variables.getReference());
ITERATE(TMetaVector, mi, domain->metas)
variables->push_back((*mi).variable);
}
else
variables= PVarList_FromArguments(pyknownVars);
if (!variables)
raiseError("invalid value for 'use' argument"); // PYERROR won't do - NULL is a valid value to return...
return variables;
}
PDomain knownDomain(PyObject *keywords)
{
PVarList variables;
PyObject *pyknownDomain = keywords ? PyDict_GetItemString(keywords, "domain") : PYNULL;
if (!pyknownDomain || (pyknownDomain == Py_None))
return PDomain();
if (!PyOrDomain_Check(pyknownDomain))
raiseError("invalid value for 'domain' argument"); // PYERROR won't do - NULL is a valid value to return...
return PyOrange_AsDomain(pyknownDomain);
}
TMetaVector *knownMetas(PyObject *keywords)
{
if (!keywords)
return NULL;
PyObject *pyknownDomain = PyDict_GetItemString(keywords, "domain");
if (pyknownDomain && (pyknownDomain != Py_None)) {
if (!PyOrDomain_Check(pyknownDomain))
raiseError("invalid value for 'domain' argument"); // PYERROR won't do - NULL is a valid value to return...
return &PyOrange_AsDomain(pyknownDomain)->metas;
}
pyknownDomain = PyDict_GetItemString(keywords, "use");
if (pyknownDomain && PyOrDomain_Check(pyknownDomain))
return &PyOrange_AsDomain(pyknownDomain)->metas;
return NULL;
}
ABSTRACT(Variable, Orange)
C_NAMED(IntVariable, Variable, "([name=, startValue=, endValue=, distributed=, getValueFrom=])")
C_NAMED(EnumVariable, Variable, "([name=, values=, autoValues=, distributed=, getValueFrom=])")
C_NAMED(FloatVariable, Variable, "([name=, startValue=, endValue=, stepValue=, distributed=, getValueFrom=])")
#include "stringvars.hpp"
C_NAMED(StringVariable, Variable, "([name=])")
#include "pythonvars.hpp"
C_NAMED(PythonVariable, Variable, "([name=])")
PyObject *PythonValue_new(PyTypeObject *type, PyObject *args, PyObject *kwds) BASED_ON(SomeValue, "([object])")
{
if (!PyTuple_Size(args))
return WrapNewOrange(mlnew TPythonValue(), type);
if (PyTuple_Size(args)==1) {
Py_INCREF(PyTuple_GET_ITEM(args, 0));
return WrapNewOrange(mlnew TPythonValue(PyTuple_GET_ITEM(args, 0)), type);
}
else
PYERROR(PyExc_TypeError, "PythonValue.__init__ expects up to one Python object", PYNULL);
}
PyObject *PythonValueSpecial_new(PyTypeObject *type, PyObject *args, PyObject *kwds) BASED_ON(Orange, "(int)") ALLOWS_EMPTY
{
int vtype = 1;
if (!PyArg_ParseTuple(args, "|i:PythonValueSpecial.__init__", &vtype))
return PYNULL;
return WrapNewOrange(mlnew TPythonValueSpecial(vtype), type);
}
int PythonValue_set_value(PyObject *self, PyObject *value)
{
Py_INCREF(value);
SELF_AS(TPythonValue).value = value;
return 0;
}
PyObject *PythonValue_get_value(PyObject *self)
{
PyObject *res = SELF_AS(TPythonValue).value;
Py_INCREF(res);
return res;
}
PyObject *PythonValue__reduce__(PyObject *self)
{
return Py_BuildValue("O(O)", (PyObject *)(self->ob_type), SELF_AS(TPythonValue).value);
}
PyObject *Variable_randomvalue(PyObject *self, PyObject *args) PYARGS(0, "() -> Value")
{ PyTRY
CAST_TO(TVariable, var);
if (args && !PyArg_ParseTuple(args, ""))
PYERROR(PyExc_TypeError, "no parameters expected", PYNULL);
return Value_FromVariableValue(PyOrange_AsVariable(self), var->randomValue());
PyCATCH
}
PyObject *Variable_firstvalue(PyObject *self, PyObject *args) PYARGS(0, "() -> Value | None")
{ PyTRY
CAST_TO(TVariable, var);
if (args && !PyArg_ParseTuple(args, ""))
PYERROR(PyExc_TypeError, "no parameters expected", PYNULL);
TValue val;
if (!var->firstValue(val)) RETURN_NONE;
return Value_FromVariableValue(PyOrange_AsVariable(self), val);
PyCATCH
}
PyObject *Variable_nextvalue(PyObject *self, PyObject *val) PYARGS(METH_O, "(value) -> Value | None")
{ PyTRY
CAST_TO(TVariable, var);
if ( !PyOrValue_Check(val)
|| (PyValue_AS_Variable(val) ? (PyValue_AS_Variable(val) != var) : (PyValue_AS_Value(val).varType != var->varType)))
PYERROR(PyExc_TypeError, "invalid value parameter", PYNULL);
TValue sval = PyValue_AS_Value(val);
if (!var->nextValue(sval))
RETURN_NONE;
return Value_FromVariableValue(PyOrange_AsVariable(self), sval);
PyCATCH
}
PyObject *Variable_computeValue(PyObject *self, PyObject *args) PYARGS(METH_O, "(example) -> Value")
{ PyTRY
CAST_TO(TVariable, var);
if (!PyOrExample_Check(args))
PYERROR(PyExc_TypeError, "Variable.computeValue: 'Example' expected", PYNULL);
const TExample &ex = PyExample_AS_ExampleReference(args);
int idx = ex.domain->getVarNum(var, false);
if (idx != ILLEGAL_INT)
return Value_FromVariableValue(var, ex[idx]);
if (!var->getValueFrom)
PYERROR(PyExc_SystemError, "Variable.computeValue: 'getValueFrom' not defined", PYNULL);
return Value_FromVariableValue(var, var->computeValue(PyExample_AS_ExampleReference(args)));
PyCATCH
}
PyObject *Variable_call(PyObject *self, PyObject *args, PyObject *keywords) PYDOC("(value) -> Value")
{ PyTRY
NO_KEYWORDS
PyObject *object;
TValue value;
if ( !PyArg_ParseTuple(args, "O:Variable.__call__", &object)
|| !convertFromPython(object, value, PyOrange_AsVariable(self)))
return PYNULL;
return Value_FromVariableValue(PyOrange_AsVariable(self), value);
PyCATCH
}
PyObject *Variable_DC(PyObject *self) PYARGS(METH_NOARGS, "() -> DC")
{
PyTRY
PVariable var = PyOrange_AsVariable(self);
return Value_FromVariableValue(var, var->DC());
PyCATCH
}
PyObject *Variable_DK(PyObject *self) PYARGS(METH_NOARGS, "() -> DK")
{
PyTRY
PVariable var = PyOrange_AsVariable(self);
return Value_FromVariableValue(var, var->DK());
PyCATCH
}
PyObject *Variable_specialValue(PyObject *self, PyObject *arg) PYARGS(METH_O, "(int) -> special value")
{
PyTRY
int valType;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -