1 #include <jni.h>
2 #include "placement_SolveVPSC.h"
3 #include <stdio.h>
4 #include "solve_VPSC.h"
5 #include "variable.h"
6 #include "constraint.h"
7 #include "remove_rectangle_overlap.h"
8 #include "generate-constraints.h"
9 #include <assert.h>
10 #include <map>
11 #define MaxSize 500
13 JNIEXPORT jdouble JNICALL Java_placement_SolveVPSC_solve
14 (JNIEnv *env, jobject obj, jobjectArray vName, jdoubleArray vWeight, jdoubleArray vDesPos, jintArray cLeft, jintArray cRight, jdoubleArray cGap, jdoubleArray vResult, jint mode)
15 {
16 jsize n = env->GetArrayLength(vWeight);
17 jsize m = env->GetArrayLength(cLeft);
18 int i;
19 double *lvWeight = env->GetDoubleArrayElements(vWeight, 0);
20 double *lvDesPos = env->GetDoubleArrayElements(vDesPos, 0);
21 long *lcLeft = env->GetIntArrayElements(cLeft, 0);
22 long *lcRight = env->GetIntArrayElements(cRight, 0);
23 double *lcGap = env->GetDoubleArrayElements(cGap, 0);
24 Variable **vs=new Variable*[n];
25 Constraint **cs=new Constraint*[m];
26 for (i=0; i<n; i++) {
27 jstring lvName = (jstring)env->GetObjectArrayElement(vName, i);
28 const char *name = env->GetStringUTFChars(lvName, NULL);
29 // once upon a time variables had real names, now you'll have to
30 // track them by number.
31 vs[i]=new Variable(i,lvDesPos[i],lvWeight[i]);
32 }
33 for (i=0; i<m; i++) {
34 cs[i]=new Constraint(vs[lcLeft[i]],vs[lcRight[i]],lcGap[i]);
35 }
36 double cost=0;
37 VPSC vpsc(vs,n,cs,m);
38 if(mode==0) {
39 vpsc.satisfy();
40 } else {
41 vpsc.solve();
42 }
43 for (i=0; i<n; i++) {
44 double p=vs[i]->position();
45 env->SetDoubleArrayRegion(vResult, i,1,&p);
46 }
47 for (i=0; i<m; i++) {
48 delete cs[i];
49 }
50 delete [] cs;
51 for (i=0; i<n; i++) {
52 delete vs[i];
53 }
54 env->ReleaseIntArrayElements(cLeft, lcLeft, 0);
55 env->ReleaseIntArrayElements(cRight, lcRight, 0);
56 env->ReleaseDoubleArrayElements(cGap, lcGap, 0);
57 env->ReleaseDoubleArrayElements(vWeight, lvWeight, 0);
58 env->ReleaseDoubleArrayElements(vDesPos, lvDesPos, 0);
59 delete [] vs;
60 return cost;
61 }
63 static Variable **vs;
64 static Constraint **cs;
65 static int m,n;
66 JNIEXPORT jint JNICALL Java_placement_SolveVPSC_generateXConstraints
67 (JNIEnv *env, jobject obj, jdoubleArray rMinX, jdoubleArray rMaxX, jdoubleArray rMinY, jdoubleArray rMaxY, jdoubleArray rWeight) {
68 n = (int)env->GetArrayLength(rWeight);
69 Rectangle **rs=new Rectangle*[n];
70 double *ws = env->GetDoubleArrayElements(rWeight, 0);
71 double *minX = env->GetDoubleArrayElements(rMinX, 0);
72 double *maxX = env->GetDoubleArrayElements(rMaxX, 0);
73 double *minY = env->GetDoubleArrayElements(rMinY, 0);
74 double *maxY = env->GetDoubleArrayElements(rMaxY, 0);
75 for(int i=0;i<n;i++) rs[i]=new Rectangle(minX[i],maxX[i],minY[i],maxY[i]);
76 m = generateXConstraints(rs, ws, n, vs, cs, true);
77 return m;
78 }
80 JNIEXPORT jint JNICALL Java_placement_SolveVPSC_generateYConstraints
81 (JNIEnv *env, jobject obj, jdoubleArray rMinX, jdoubleArray rMaxX, jdoubleArray rMinY, jdoubleArray rMaxY, jdoubleArray rWeight) {
82 n = (int)env->GetArrayLength(rWeight);
83 Rectangle **rs=new Rectangle*[n];
84 double *ws = env->GetDoubleArrayElements(rWeight, 0);
85 double *minX = env->GetDoubleArrayElements(rMinX, 0);
86 double *maxX = env->GetDoubleArrayElements(rMaxX, 0);
87 double *minY = env->GetDoubleArrayElements(rMinY, 0);
88 double *maxY = env->GetDoubleArrayElements(rMaxY, 0);
89 for(int i=0;i<n;i++) rs[i]=new Rectangle(minX[i],maxX[i],minY[i],maxY[i]);
90 m = generateYConstraints(rs, ws, n, vs, cs);
91 return m;
92 }
93 using namespace std;
94 JNIEXPORT void JNICALL Java_placement_SolveVPSC_getConstraints
95 (JNIEnv *env, jobject obj, jintArray cLeft, jintArray cRight, jdoubleArray cGap) {
96 map<Variable*,int> vmap;
97 for(int i=0;i<n;i++) {
98 vmap[vs[i]]=i;
99 }
101 for(int i=0;i<m;i++) {
102 jint l=vmap[cs[i]->left];
103 jint r=vmap[cs[i]->right];
104 double g=cs[i]->gap;
105 env->SetIntArrayRegion(cLeft, i,1,&l);
106 env->SetIntArrayRegion(cRight, i,1,&r);
107 env->SetDoubleArrayRegion(cGap, i,1,&g);
108 }
109 }
110 JNIEXPORT void JNICALL Java_placement_SolveVPSC_removeOverlaps
111 (JNIEnv *env, jobject obj, jdoubleArray rMinX, jdoubleArray rMaxX, jdoubleArray rMinY, jdoubleArray rMaxY) {
112 //assert(1==2); //break for debugging
113 n = (int)env->GetArrayLength(rMinX);
114 Rectangle **rs=new Rectangle*[n];
115 double *minX = env->GetDoubleArrayElements(rMinX, 0);
116 double *maxX = env->GetDoubleArrayElements(rMaxX, 0);
117 double *minY = env->GetDoubleArrayElements(rMinY, 0);
118 double *maxY = env->GetDoubleArrayElements(rMaxY, 0);
119 for(int i=0;i<n;i++) rs[i]=new Rectangle(minX[i],maxX[i],minY[i],maxY[i]);
120 removeRectangleOverlap(rs,n,0,0);
121 for (i=0; i<n; i++) {
122 double x=rs[i]->getMinX();
123 double y=rs[i]->getMinY();
124 env->SetDoubleArrayRegion(rMinX, i,1,&x);
125 env->SetDoubleArrayRegion(rMinY, i,1,&y);
126 }
127 delete [] rs;
128 env->ReleaseDoubleArrayElements(rMaxX, maxX, 0);
129 env->ReleaseDoubleArrayElements(rMaxY, maxY, 0);
130 }