File:  [CENS] / python / pyGiNaC / wrappers4 / numeric.cpp
Revision 1.10: download - view: text, annotated - select for diffs - revision graph
Mon Nov 26 22:37:44 2001 UTC (16 years ago) by pearu
Branches: MAIN
CVS tags: HEAD
See NEWS.txt (impl. matrix)

/*
  This file is part of the PyGiNaC package.
  http://cens.ioc.ee/projects/pyginac/

  $Revision: 1.10 $
  $Id: numeric.cpp,v 1.10 2001-11-26 22:37:44 pearu Exp $
 
  Copyright 2001 Pearu Peterson all rights reserved,
  Pearu Peterson <pearu@cens.ioc.ee>
  Permission to use, modify, and distribute this software is given under the
  terms of the LGPL.  See http://www.fsf.org
 
  NO WARRANTY IS EXPRESSED OR IMPLIED.  USE AT YOUR OWN RISK.
*/

#ifndef PYGINAC_NUMERIC_CPP
#define PYGINAC_NUMERIC_CPP
/* prototypes */
GiNaC::ex numeric(const GiNaC::numeric & numer);
std::string numeric_to_context(const GiNaC::numeric & n, unsigned level);
const GiNaC::numeric numeric_lshift(const GiNaC::numeric & x, const GiNaC::numeric &n);
const GiNaC::numeric numeric_rshift(const GiNaC::numeric & x, const GiNaC::numeric &n);
const GiNaC::numeric numeric_psi(const GiNaC::numeric & x);
void set_Digits(long);
long get_Digits(void);
BOOST_PYTHON_BEGIN_CONVERSION_NAMESPACE
GiNaC::numeric & from_python (PyObject* o, py::type<GiNaC::numeric &>);
const GiNaC::numeric & from_python (PyObject* o, py::type<const GiNaC::numeric &>);
PyObject * to_python(const GiNaC::numeric & obj);
BOOST_PYTHON_END_CONVERSION_NAMESPACE
#else
#ifndef PYGINAC_NUMERIC_CPP_1
#define PYGINAC_NUMERIC_CPP_1
/* definitions */
this_module.def(numeric, "numeric");
this_module.def(get_Digits, "get_Digits");
this_module.def(set_Digits, "set_Digits");
ex_class.def(&GiNaC::numeric::add, "numeric_add");
ex_class.def(&GiNaC::numeric::sub, "numeric_sub");
ex_class.def(&GiNaC::numeric::mul, "numeric_mul");
ex_class.def(&GiNaC::numeric::div, "numeric_div");
ex_class.def(&GiNaC::numeric::power, "numeric_power");

ex_class.def((const GiNaC::numeric(*)(const GiNaC::numeric&))GiNaC::exp,"numeric_exp");
ex_class.def((const GiNaC::numeric(*)(const GiNaC::numeric&))GiNaC::log,"numeric_log");
ex_class.def((const GiNaC::numeric(*)(const GiNaC::numeric&))GiNaC::sin,"numeric_sin");
ex_class.def((const GiNaC::numeric(*)(const GiNaC::numeric&))GiNaC::cos,"numeric_cos");
ex_class.def((const GiNaC::numeric(*)(const GiNaC::numeric&))GiNaC::tan,"numeric_tan");
ex_class.def((const GiNaC::numeric(*)(const GiNaC::numeric&))GiNaC::asin,"numeric_asin");
ex_class.def((const GiNaC::numeric(*)(const GiNaC::numeric&))GiNaC::acos,"numeric_acos");
ex_class.def((const GiNaC::numeric(*)(const GiNaC::numeric&))GiNaC::atan,"numeric_atan");
ex_class.def((const GiNaC::numeric(*)(const GiNaC::numeric&))GiNaC::sinh,"numeric_sinh");
ex_class.def((const GiNaC::numeric(*)(const GiNaC::numeric&))GiNaC::cosh,"numeric_cosh");
ex_class.def((const GiNaC::numeric(*)(const GiNaC::numeric&))GiNaC::tanh,"numeric_tanh");
ex_class.def((const GiNaC::numeric(*)(const GiNaC::numeric&))GiNaC::asinh,"numeric_asinh");
ex_class.def((const GiNaC::numeric(*)(const GiNaC::numeric&))GiNaC::acosh,"numeric_acosh");
ex_class.def((const GiNaC::numeric(*)(const GiNaC::numeric&))GiNaC::atanh,"numeric_atanh");
ex_class.def((const GiNaC::numeric(*)(const GiNaC::numeric&))GiNaC::Li2,"numeric_Li2");
ex_class.def((const GiNaC::numeric(*)(const GiNaC::numeric&))GiNaC::zeta,"numeric_zeta");
ex_class.def((const GiNaC::numeric(*)(const GiNaC::numeric&))GiNaC::lgamma,"numeric_lgamma");
ex_class.def((const GiNaC::numeric(*)(const GiNaC::numeric&))GiNaC::tgamma,"numeric_tgamma");
ex_class.def(numeric_psi,"numeric_psi");
ex_class.def((const GiNaC::numeric(*)(const GiNaC::numeric&))GiNaC::factorial,"numeric_factorial");
ex_class.def((const GiNaC::numeric(*)(const GiNaC::numeric&))GiNaC::doublefactorial,"numeric_doublefactorial");
ex_class.def((const GiNaC::numeric(*)(const GiNaC::numeric&))GiNaC::bernoulli,"numeric_bernoulli");
ex_class.def((const GiNaC::numeric(*)(const GiNaC::numeric&))GiNaC::fibonacci,"numeric_fibonacci");
ex_class.def((const GiNaC::numeric(*)(const GiNaC::numeric&))GiNaC::isqrt,"numeric_isqrt");
ex_class.def((const GiNaC::numeric(*)(const GiNaC::numeric&))GiNaC::sqrt,"numeric_sqrt");
ex_class.def((const GiNaC::numeric(*)(const GiNaC::numeric&))GiNaC::abs,"numeric_abs");

ex_class.def((const GiNaC::numeric(*)(const GiNaC::numeric&,const GiNaC::numeric&))GiNaC::atan,"numeric_atan2");
ex_class.def((const GiNaC::numeric(*)(const GiNaC::numeric&,const GiNaC::numeric&))GiNaC::psi,"numeric_psi2");
ex_class.def((const GiNaC::numeric(*)(const GiNaC::numeric&,const GiNaC::numeric&))GiNaC::mod,"numeric_mod");
ex_class.def((const GiNaC::numeric(*)(const GiNaC::numeric&,const GiNaC::numeric&))GiNaC::binomial,"numeric_binomial");
ex_class.def((const GiNaC::numeric(*)(const GiNaC::numeric&,const GiNaC::numeric&))GiNaC::mod,"numeric_mod");
ex_class.def((const GiNaC::numeric(*)(const GiNaC::numeric&,const GiNaC::numeric&))GiNaC::smod,"numeric_smod");
ex_class.def((const GiNaC::numeric(*)(const GiNaC::numeric&,const GiNaC::numeric&))GiNaC::irem,"numeric_irem");
ex_class.def((const GiNaC::numeric(*)(const GiNaC::numeric&,const GiNaC::numeric&))GiNaC::iquo,"numeric_iquo");
ex_class.def((const GiNaC::numeric(*)(const GiNaC::numeric&,const GiNaC::numeric&))GiNaC::gcd,"numeric_gcd");
ex_class.def((const GiNaC::numeric(*)(const GiNaC::numeric&,const GiNaC::numeric&))GiNaC::lcm,"numeric_lcm");


ex_class.def(&GiNaC::numeric::is_zero, "numeric_is_zero");
ex_class.def(&GiNaC::numeric::is_positive, "numeric_is_positive");
ex_class.def(&GiNaC::numeric::is_negative, "numeric_is_negative");
ex_class.def(&GiNaC::numeric::is_integer, "numeric_is_integer");
ex_class.def(&GiNaC::numeric::is_pos_integer, "numeric_is_pos_integer");
ex_class.def(&GiNaC::numeric::is_nonneg_integer, "numeric_is_nonneg_integer");
ex_class.def(&GiNaC::numeric::is_even, "numeric_is_even");
ex_class.def(&GiNaC::numeric::is_odd, "numeric_is_odd");
ex_class.def(&GiNaC::numeric::is_prime, "numeric_is_prime");
ex_class.def(&GiNaC::numeric::is_rational, "numeric_is_rational");
ex_class.def(&GiNaC::numeric::is_real, "numeric_is_real");
ex_class.def(&GiNaC::numeric::is_cinteger, "numeric_is_cinteger");
ex_class.def(&GiNaC::numeric::is_crational, "numeric_is_crational");
ex_class.def(&GiNaC::numeric::real, "numeric_real");
ex_class.def(&GiNaC::numeric::imag, "numeric_imag");
ex_class.def(&GiNaC::numeric::numer, "numeric_numer");
ex_class.def(&GiNaC::numeric::denom, "numeric_denom");
ex_class.def(&GiNaC::numeric::inverse, "numeric_inverse");
ex_class.def(&GiNaC::numeric::csgn, "numeric_csgn");
ex_class.def(&GiNaC::numeric::int_length, "numeric_int_length");
ex_class.def(&GiNaC::numeric::to_long, "numeric_to_long");
ex_class.def(&GiNaC::numeric::to_double, "numeric_to_double");
ex_class.def(&GiNaC::numeric::power, "numeric_power");
ex_class.def(&GiNaC::numeric::compare, "numeric_compare");
ex_class.def(&GiNaC::numeric::is_equal, "numeric_is_equal");
ex_class.def(numeric_to_context, "numeric_to_context");
ex_class.def(numeric_lshift, "numeric_lshift");
ex_class.def(numeric_rshift, "numeric_rshift");
#else
/* implementation */
GiNaC::ex numeric(const GiNaC::numeric & numer) {
  return GiNaC::numeric(numer);
}
std::string numeric_to_context(const GiNaC::numeric & n, unsigned level) {
  std::ostringstream os;
  n.print(GiNaC::print_context(os),level);
  return os.str();
}
const GiNaC::numeric numeric_lshift(const GiNaC::numeric & x, const GiNaC::numeric &n) {
  if (x.is_integer() && n.is_nonneg_integer())
    return cln::ash(cln::the<cln::cl_I>(x.to_cl_N()),cln::the<cln::cl_I>(n.to_cl_N()));
  return x * GiNaC::numeric(2).power(n);
}
const GiNaC::numeric numeric_rshift(const GiNaC::numeric & x, const GiNaC::numeric &n) {
  if (x.is_integer() && n.is_nonneg_integer())
    return cln::ash(cln::the<cln::cl_I>(x.to_cl_N()), -cln::the<cln::cl_I>(n.to_cl_N()));
  return x / GiNaC::numeric(2).power(n);
}
const GiNaC::numeric numeric_psi(const GiNaC::numeric & x) {
  return GiNaC::psi(x);
}
void set_Digits(long prec) {
  GiNaC::Digits = prec;
}
long get_Digits(void) {
  return GiNaC::Digits;
}
BOOST_PYTHON_BEGIN_CONVERSION_NAMESPACE
GiNaC::numeric & from_python (PyObject* o, py::type<GiNaC::numeric &>) {
  if (PYOBJ_IS_EX(o)) {
    GiNaC::ex & e = pyobj_get_ex_nonconst(o);
    if (GiNaC::is_a<GiNaC::numeric>(e))
      return GiNaC::ex_to_nonconst<GiNaC::numeric>(e);
    PyErr_SetString(PyExc_TypeError,(std::string("from_python(ex, numeric) expected _ginac.ex(numeric)|numeric|int|float|complex|string but got ") + GiNaC::ex_to<GiNaC::basic>(e).class_name()).c_str());
    throw py::error_already_set();
  }
  if (PyInt_Check(o))
    return *(new GiNaC::numeric(PyInt_AS_LONG(o)));
  if (PyFloat_Check(o))
    return *(new GiNaC::numeric(PyFloat_AS_DOUBLE(o)));
  if (PyComplex_Check(o))
    return *(new GiNaC::numeric(cln::complex(PyComplex_RealAsDouble(o),PyComplex_ImagAsDouble(o))));
  if (PyString_Check(o))
    return *(new GiNaC::numeric(PyString_AS_STRING(o)));
  PyErr_SetString(PyExc_TypeError,(std::string("from_python(obj, numeric) expected numeric|int|float|complex|string but got ")+PyString_AsString(PyObject_Repr(PyObject_Type(o)))).c_str());
  throw py::error_already_set();
}
const GiNaC::numeric & from_python (PyObject* o, py::type<const GiNaC::numeric &>) {
  return from_python(o, py::type<GiNaC::numeric &>());
}
PyObject * to_python(const GiNaC::numeric & obj) {
  return BOOST_PYTHON_CONVERSION::to_python(GiNaC::ex(obj));
}
BOOST_PYTHON_END_CONVERSION_NAMESPACE
#endif
#endif

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>