ISCE_INSAR/components/isceobj/Util/Library/bindings/combinedlibmodule.cpp

556 lines
13 KiB
C++
Raw Normal View History

2019-01-16 19:40:08 +00:00
#include <Python.h>
#include "combinedlibmodule.h"
#include <stdint.h>
#include <iostream>
#include <string>
using namespace std;
static const char * const __doc__ = "module for combined lib";
PyModuleDef moduledef = {
PyModuleDef_HEAD_INIT,
"combinedlib",
__doc__,
-1,
combinedlib_methods,
};
PyMODINIT_FUNC
PyInit_combinedlibmodule()
{
PyObject * module = PyModule_Create(&moduledef);
if (!module) {
return module;
}
return module;
}
PyObject* exportOrbitToC(PyObject* self, PyObject* args)
{
int nvec,i,j;
int basis;
double data[7];
PyObject* list;
cOrbit *orb = new cOrbit;
if( orb == NULL)
{
cout << "Insufficient memory to allocate orbit at " << __FILE__ << endl;
exit(1);
}
if(!PyArg_ParseTuple(args, "iO", &basis, &list))
{
return NULL;
}
if(!PyList_Check(list))
{
cout << "Expecting a list object for 2nd argument at " << __FILE__ << endl;
exit(1);
}
nvec = (int) PyList_Size(list);
initOrbit(orb, nvec, basis);
for(i=0; i<nvec; i++)
{
PyObject * listEl = PyList_GetItem(list, i);
if(listEl == NULL)
{
cout << "Error in retrieving state vector number " << i <<" at " << __FILE__ << endl;
exit(1);
}
if(!PyList_Check(listEl))
{
cout << "Expecting a list of 7 double numbers at " << __FILE__ << endl;
exit(1);
}
for(j=0;j<7;j++)
{
PyObject *val = PyList_GetItem(listEl, j);
if(val == NULL)
{
cout << "Error retrieving state vector entry " << j << " at " << __FILE__ << endl;
exit(1);
}
data[j] = (double) PyFloat_AsDouble(val);
if(PyErr_Occurred() != NULL)
{
cout << "Error in translating Python List to double array at " << __FILE__ << endl;
exit(1);
}
}
setStateVector(orb, i, data[0], &(data[1]), &(data[4]));
}
return Py_BuildValue("K", (uint64_t) orb);
}
PyObject* exportPegToC(PyObject *self, PyObject* args)
{
double lat, lon, hdg;
cPeg* peg = new cPeg;
if(!PyArg_ParseTuple(args, "ddd", &lat, &lon, &hdg))
{
return NULL;
}
peg->lat = lat;
peg->lon = lon;
peg->hdg = hdg;
return Py_BuildValue("K", (uint64_t) peg);
}
PyObject* exportEllipsoidToC(PyObject *self, PyObject* args)
{
double a, e2;
cEllipsoid* elp = new cEllipsoid;
if(!PyArg_ParseTuple(args, "dd", &a, &e2))
{
return NULL;
}
elp->a = a;
elp->e2 = e2;
return Py_BuildValue("K", (uint64_t) elp);
}
PyObject* exportPoly1DToC(PyObject *self, PyObject *args)
{
cPoly1d* poly = new cPoly1d;
PyObject* list;
int order,i;
double mean, norm;
if(!PyArg_ParseTuple(args, "iddO",&order,&mean,&norm,&list))
{
return NULL;
}
initPoly1d(poly, order);
poly->mean = mean;
poly->norm = norm;
if(!PyList_Check(list))
{
cout << "Expecting a list of 1D polynomial coefficients at " << __FILE__ << endl;
exit(1);
}
for(i=0; i<= order; i++)
{
PyObject* listEl = PyList_GetItem(list, i);
if(listEl == NULL)
{
cout << "Expecting a double precision float from the list at " << __FILE__ << endl;
exit(1);
}
poly->coeffs[i] = (double) PyFloat_AsDouble(listEl);
if(PyErr_Occurred() != NULL)
{
cout << "Conversion from list element to double precision float failed at " << __FILE__ << endl;
exit(1);
}
}
return Py_BuildValue("K", (uint64_t) poly);
}
PyObject* exportPoly2DToC(PyObject *self, PyObject *args)
{
cPoly2d* poly = new cPoly2d;
int orders[2];
double means[2], norms[2];
PyObject* ord;
PyObject* avg;
PyObject* norm;
PyObject* list;
int nx, ny;
double val;
if(!PyArg_ParseTuple(args, "OOOO", &ord, &avg, &norm, &list))
{
return NULL;
}
if(!PyList_Check(ord))
{
cout << "Expected 1st argument to be a list of 2 integers at " << __FILE__ << endl;
exit(1);
}
for(int i=0; i<2; i++)
{
PyObject* listEl = PyList_GetItem(ord, i);
if(listEl == NULL)
{
cout << "Expecting an int from the list at " << __FILE__ << endl;
exit(1);
}
orders[i] = (int) PyLong_AsLong(listEl);
if(PyErr_Occurred() != NULL)
{
cout << "Conversion from list element to integer failed at " << __FILE__ << endl;
exit(1);
}
}
initPoly2d(poly, orders[0], orders[1]);
if(!PyList_Check(avg))
{
cout << "Expected 2nd argument to be a list of 2 floats at " << __FILE__ << endl;
exit(1);
}
for(int i=0; i<2;i++)
{
PyObject* listEl = PyList_GetItem(avg, i);
if(listEl == NULL)
{
cout << "Expecting a double precision float from the list at " << __FILE__ << endl;
exit(1);
}
means[i] = (double) PyFloat_AsDouble(listEl);
if(PyErr_Occurred() != NULL)
{
cout << "Conversion from list element to double precision float failed at " << __FILE__ << endl;
exit(1);
}
}
poly->meanAzimuth = means[0];
poly->meanRange = means[1];
if(!PyList_Check(norm))
{
cout << "Expected 3rd argument to be a list of 2 floats at " << __FILE__ << endl;
exit(1);
}
for(int i=0; i<2;i++)
{
PyObject* listEl = PyList_GetItem(norm, i);
if(listEl == NULL)
{
cout << "Expecting a double precision float from the list at " << __FILE__ << endl;
exit(1);
}
norms[i] = (double) PyFloat_AsDouble(listEl);
if(PyErr_Occurred() != NULL)
{
cout << "Conversion from list element to double precision float failed at " << __FILE__ << endl;
exit(1);
}
}
poly->normAzimuth = norms[0];
poly->normRange = norms[1];
if(!PyList_Check(list))
{
cout << "Expected 4th argument to be a list of coefficients at " << __FILE__ << endl;
exit(1);
}
ny = (int) PyList_Size(list);
if( ny != (orders[0]+1))
{
cout << "Expected a list of size " << orders[0]+1 << " azimuth coeffs at " << __FILE__ << endl;
exit(1);
}
for(int i=0; i< ny; i++)
{
PyObject* listEl = PyList_GetItem(list, i);
if(listEl == NULL)
{
cout << "Failed to extract a list of range coeffs at " << __FILE__ << endl;
exit(1);
}
if(!PyList_Check(listEl))
{
cout << "Expected a list of range coeffs at " << __FILE__ << endl;
exit(1);
}
nx = (int) PyList_Size(listEl);
if(nx != (orders[1]+1))
{
cout << "Expected a list of size " << orders[1]+1 << " range coeffs at " << __FILE__ << endl;
exit(1);
}
for(int j=0; j< nx; j++)
{
PyObject* elem = PyList_GetItem(listEl, j);
val = (double) PyFloat_AsDouble(elem);
if(PyErr_Occurred() != NULL)
{
cout << "Error in converting double precision float from list of coeffs at " << __FILE__ << endl;
exit(1);
}
setCoeff2d(poly, i,j,val);
}
}
printPoly2d(poly);
return Py_BuildValue("K", (uint64_t) poly);
}
PyObject* freeCOrbit(PyObject *self, PyObject* args)
{
cOrbit* orb;
uint64_t cptr;
if(!PyArg_ParseTuple(args, "K",&cptr))
{
return NULL;
}
orb = (cOrbit*) cptr;
deleteOrbit(orb);
return Py_BuildValue("i", 0);
}
PyObject* freeCPoly2D(PyObject *self, PyObject* args)
{
cPoly2d* poly;
uint64_t cptr;
if(!PyArg_ParseTuple(args, "K", &cptr))
{
return NULL;
}
poly = (cPoly2d*) cptr;
deletePoly2d(poly);
return Py_BuildValue("i", 0);
}
PyObject* freeCPoly1D(PyObject *self, PyObject* args)
{
cPoly1d* poly;
uint64_t cptr;
if(!PyArg_ParseTuple(args, "K", &cptr))
{
return NULL;
}
poly = (cPoly1d*) cptr;
deletePoly1d(poly);
return Py_BuildValue("i", 0);
}
PyObject* freeCPeg(PyObject* self, PyObject* args)
{
cPeg* peg;
uint64_t cptr;
if(!PyArg_ParseTuple(args, "K", &cptr))
{
return NULL;
}
peg = (cPeg*) cptr;
delete peg;
return Py_BuildValue("i", 0);
}
PyObject* freeCEllipsoid(PyObject* self, PyObject* args)
{
cEllipsoid* elp;
uint64_t cptr;
if(!PyArg_ParseTuple(args, "K", &cptr))
{
return NULL;
}
elp = (cEllipsoid*) cptr;
delete elp;
return Py_BuildValue("i", 0);
}
PyObject* importPegFromC(PyObject *self, PyObject* args)
{
cPeg* peg;
uint64_t cptr;
if(!PyArg_ParseTuple(args, "K", &cptr))
{
return NULL;
}
peg = (cPeg*) cptr;
return Py_BuildValue("ddd", peg->lat, peg->lon, peg->hdg);
}
PyObject* importPoly1DFromC(PyObject *self, PyObject *args)
{
uint64_t cptr;
cPoly1d* poly;
if(!PyArg_ParseTuple(args, "K", &cptr))
{
return NULL;
}
poly = (cPoly1d*) cptr;
PyObject *list = PyList_New(poly->order + 1);
for(int i=0; i< (poly->order+1); i++)
{
PyObject* listEl = PyFloat_FromDouble(poly->coeffs[i]);
if (listEl == NULL)
{
cout << "Error in converting polynomial coefficient to list element at " << __FILE__ << endl;
exit(1);
}
PyList_SetItem(list, i, listEl);
}
return Py_BuildValue("iddN",poly->order, poly->mean, poly->norm, list);
}
PyObject* importPoly2DFromC(PyObject *self, PyObject *args)
{
uint64_t cptr;
cPoly2d* poly;
if(!PyArg_ParseTuple(args, "K", &cptr))
{
return NULL;
}
poly = (cPoly2d*) cptr;
PyObject* list2d = PyList_New((poly->azimuthOrder+1)*(poly->rangeOrder+1));
for(int i=0; i<=poly->azimuthOrder; i++)
{
for(int j=0; j<= poly->rangeOrder; j++)
{
PyObject* listEl = PyFloat_FromDouble(getCoeff2d(poly,i,j));
if(listEl == NULL)
{
cout << "Error in converting polynomial2d coefficient to list element at " << __FILE__ << endl;
exit(1);
}
PyList_SetItem(list2d, i*(poly->rangeOrder+1)+j, listEl);
if(PyErr_Occurred() != NULL)
{
cout << "Error in setting list value at " << __FILE__ << endl;
exit(1);
}
}
}
printPoly2d(poly);
return Py_BuildValue("(ii)(dd)(dd) N",poly->azimuthOrder,
poly->rangeOrder, poly->meanAzimuth, poly->meanRange,
poly->normAzimuth, poly->normRange, list2d);
}
PyObject* importOrbitFromC(PyObject *self, PyObject* args)
{
uint64_t cptr;
cOrbit* orb;
double tim;
double pos[3], vel[3];
if(!PyArg_ParseTuple(args, "K", &cptr))
{
return NULL;
}
orb = (cOrbit*) cptr;
PyObject* list2d = PyList_New(orb->nVectors);
for(int i=0; i< (orb->nVectors); i++)
{
getStateVector(orb, i, &tim, pos, vel);
// cout << "Index: " << i << " out of " << orb->nVectors << "\n";
// cout << "Time: " << tim << "\n";
// cout << "Position: "<< pos[0] << " " << pos[1] << " " << pos[2] << "\n";
// cout << "Velocity: "<< vel[0] << " " << vel[1] << " " << vel[2] << "\n";
PyObject* list= PyList_New(7);
if(PyErr_Occurred() != NULL)
{
PyErr_Print();
cout << "Could not create a list out of a single state vector"<<endl;
exit(1);
}
PyObject* obj = PyFloat_FromDouble(tim);
if(PyErr_Occurred() != NULL)
{
PyErr_Print();
cout << "Error in converting time to list element at " << __FILE__ << endl;
exit(1);
}
PyList_SetItem(list, 0, obj);
if(PyErr_Occurred() != NULL)
{
PyErr_Print();
cout << "Error in converting time to list element at " << __FILE__ << endl;
exit(1);
}
for(int j=0; j<3; j++)
{
PyObject *num = PyFloat_FromDouble(pos[j]);
if(PyErr_Occurred() != NULL)
{
PyErr_Print();
cout << "Error in converting positions to list elements at " << __FILE__ << endl;
exit(1);
}
PyList_SetItem(list, j+1, num);
}
for(int j=0; j<3; j++)
{
PyObject *num = PyFloat_FromDouble(vel[j]);
if(PyErr_Occurred() != NULL)
{
PyErr_Print();
cout << "Error in converting velocities to list elements at " << __FILE__ << endl;
exit(1);
}
PyList_SetItem(list, j+4, num);
}
PyList_SetItem(list2d, i, list);
}
return Py_BuildValue("iN", orb->basis, list2d);
}