ISCE_INSAR/library/isceLib/pyx/Poly1d.pyx

114 lines
3.3 KiB
Cython

#cython: language_level=3
#
# Author: Joshua Cohen
# Copyright 2017
#
#################################################################
cdef extern from "Poly1d.h" namespace "isceLib":
cdef cppclass Poly1d:
int order
double mean
double norm
double *coeffs
Poly1d() except +
Poly1d(int,double,double) except +
Poly1d(int,double,double,double*) except +
Poly1d(const Poly1d&) except +
int isNull()
void resetCoeffs()
void setCoeff(int,double)
double getCoeff(int)
double eval(double)
cdef class PyPoly1d:
cdef Poly1d c_poly1d
def __cinit__(self, a=None, b=None, c=None, d=None):
if (d): # Init with coeffs
if (a):
self.order = a
else:
self.order = len(d) - 1
self.mean = b
self.norm = c
self.coeffs = d
elif (a): # Init without coeffs
self.order = a
self.mean = b
self.norm = c
@property
def order(self):
return self.c_poly1d.order
@order.setter
def order(self, int a):
if (a < 0):
return
if (a+1 != len(self.coeffs)):
c = self.coeffs
for i in range(a+1-len(c)): # If new order is higher than current order
c.append(0.)
nc = []
for i in range(a+1): # Truncate coeffs as necesary
nc.append(c[i])
self.c_poly1d.order = a
self.resetCoeffs()
self.coeffs = nc
@property
def mean(self):
return self.c_poly1d.mean
@mean.setter
def mean(self, double a):
self.c_poly1d.mean = a
@property
def norm(self):
return self.c_poly1d.norm
@norm.setter
def norm(self, double a):
self.c_poly1d.norm = a
@property
def coeffs(self):
a = []
if (self.isNull() == 1):
return a
for i in range(self.order+1):
a.append(self.c_poly1d.coeffs[i])
return a
@coeffs.setter
def coeffs(self, a):
if (self.order+1 != len(a)):
print("Error: Invalid input size (expected list of length "+str(self.order+1)+")")
return
if (self.isNull() == 1):
print("Warning: Memory was not malloc'd for coefficients. Order will be set appropriately.")
self.order = len(a) - 1
self.resetCoeffs()
for i in range(self.order+1):
self.c_poly1d.coeffs[i] = a[i]
def copy(self, poly):
try:
self.order = poly.order
self.mean = poly.mean
self.norm = poly.norm
self.resetCoeffs()
self.coeffs = poly.coeffs
except:
print("Error: Object passed in to copy is not of type PyPoly1d.")
def dPrint(self):
print("Order = "+str(self.order)+", mean = "+str(self.mean)+", norm = "+str(self.norm)+", coeffs = "+str(self.coeffs))
def isNull(self):
return self.c_poly1d.isNull()
def resetCoeffs(self):
self.c_poly1d.resetCoeffs()
def setCoeff(self, int a, double b):
self.c_poly1d.setCoeff(a,b)
def getCoeff(self, int a):
return self.c_poly1d.getCoeff(a)
def eval(self, double a):
return self.c_poly1d.eval(a)