| 518 | } |
| 519 | |
| 520 | static PyObject* PyTensorObject_var(PyObject* self, PyObject* args, PyObject* kwargs) { |
| 521 | HANDLE_ERRORS |
| 522 | PyObject* dim_obj = Py_None; |
| 523 | PyObject* unbiased_obj = Py_True; |
| 524 | PyObject* keepdim_obj = Py_False; |
| 525 | static const char* keywords[4] = {"dim", "unbiased", "keepdim", NULL}; |
| 526 | if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|OO!O!:var", const_cast<char**>(keywords), |
| 527 | &dim_obj, &PyBool_Type, &unbiased_obj, &PyBool_Type, |
| 528 | &keepdim_obj)) { |
| 529 | return NULL; |
| 530 | } |
| 531 | bool unbiased = unbiased_obj == Py_True; |
| 532 | bool keepdim = keepdim_obj == Py_True; |
| 533 | CHECK_OR_THROW(dim_obj == Py_None || PyLong_Check(dim_obj) |
| 534 | || functional::PyLongSequenceCheck(dim_obj)) |
| 535 | << Error::TypeError() << "var(): argument 'dim' must be int32 list, not " |
| 536 | << functional::PyStringAsString(PyObject_Str((PyObject*)Py_TYPE(dim_obj))); |
| 537 | auto tensor = PyTensor_Unpack(self); |
| 538 | if (dim_obj == Py_None) { |
| 539 | return PyTensor_New(ASSERT_PTR(functional::Variance(tensor, NullOpt, unbiased, keepdim))); |
| 540 | } |
| 541 | std::vector<int32_t> dim; |
| 542 | if (PyLong_Check(dim_obj)) { |
| 543 | dim.emplace_back(static_cast<int32_t>(PyLong_AsLong(dim_obj))); |
| 544 | return PyTensor_New(ASSERT_PTR(functional::Variance(tensor, dim, unbiased, keepdim))); |
| 545 | } |
| 546 | dim = functional::PyUnpackLongSequence<int32_t>(dim_obj); |
| 547 | return PyTensor_New(ASSERT_PTR(functional::Variance(tensor, dim, unbiased, keepdim))); |
| 548 | END_HANDLE_ERRORS |
| 549 | } |
| 550 | |
| 551 | static PyObject* PyTensorObject_std(PyObject* self, PyObject* args, PyObject* kwargs) { |
| 552 | HANDLE_ERRORS |
nothing calls this directly
no test coverage detected