| 549 | } |
| 550 | |
| 551 | static PyObject* PyTensorObject_std(PyObject* self, PyObject* args, PyObject* kwargs) { |
| 552 | HANDLE_ERRORS |
| 553 | PyObject* dim_obj = Py_None; |
| 554 | PyObject* unbiased_obj = Py_True; |
| 555 | PyObject* keepdim_obj = Py_False; |
| 556 | static const char* keywords[4] = {"dim", "unbiased", "keepdim", NULL}; |
| 557 | if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|OO!O!:std", const_cast<char**>(keywords), |
| 558 | &dim_obj, &PyBool_Type, &unbiased_obj, &PyBool_Type, |
| 559 | &keepdim_obj)) { |
| 560 | return NULL; |
| 561 | } |
| 562 | bool unbiased = unbiased_obj == Py_True; |
| 563 | bool keepdim = keepdim_obj == Py_True; |
| 564 | CHECK_OR_THROW(dim_obj == Py_None || PyLong_Check(dim_obj) |
| 565 | || functional::PyLongSequenceCheck(dim_obj)) |
| 566 | << Error::TypeError() << "std(): argument 'dim' must be int32 list, not " |
| 567 | << functional::PyStringAsString(PyObject_Str((PyObject*)Py_TYPE(dim_obj))); |
| 568 | auto tensor = PyTensor_Unpack(self); |
| 569 | if (dim_obj == Py_None) { |
| 570 | return PyTensor_New( |
| 571 | ASSERT_PTR(functional::StandardDeviation(tensor, NullOpt, unbiased, keepdim))); |
| 572 | } |
| 573 | std::vector<int32_t> dim; |
| 574 | if (PyLong_Check(dim_obj)) { |
| 575 | dim.emplace_back(static_cast<int32_t>(PyLong_AsLong(dim_obj))); |
| 576 | return PyTensor_New(ASSERT_PTR(functional::StandardDeviation(tensor, dim, unbiased, keepdim))); |
| 577 | } |
| 578 | dim = functional::PyUnpackLongSequence<int32_t>(dim_obj); |
| 579 | return PyTensor_New(ASSERT_PTR(functional::StandardDeviation(tensor, dim, unbiased, keepdim))); |
| 580 | END_HANDLE_ERRORS |
| 581 | } |
| 582 | |
| 583 | static PyObject* PyTensorObject_softplus(PyObject* self, PyObject* args, PyObject* kwargs) { |
| 584 | HANDLE_ERRORS |
nothing calls this directly
no test coverage detected