Changeset 7692 for trunk/projects


Ignore:
Timestamp:
04/11/11 20:32:36 (9 years ago)
Author:
aivar
Message:

Changes to get JNI working (vs JNA). Currently has both versions possible.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/projects/curve-fitter/src/main/java/loci/curvefitter/SLIMCurveFitter.java

    r7689 r7692  
    3535package loci.curvefitter; 
    3636 
     37//TODO old style: 
    3738import com.sun.jna.Library; 
    3839import com.sun.jna.Native; 
    3940import com.sun.jna.ptr.DoubleByReference; 
     41//TODO 
    4042 
    4143import ij.IJ; 
     
    5355 */ 
    5456public class SLIMCurveFitter extends AbstractCurveFitter { 
     57    //TODO old style: 
    5558    static CLibrary s_library; 
     59    boolean m_oldStyle = false; 
     60    //TODO 
     61    static boolean s_loaded = false; 
    5662    public enum AlgorithmType { RLD, LMA, RLD_LMA }; 
    5763    private AlgorithmType m_algorithmType; 
    5864 
     65    //TODO old style 
    5966    public interface CLibrary extends Library { 
    6067 
     
    124131                                                                        float chisq_target, int chisq_percent) {*/ 
    125132    } 
     133    //TODO 
     134 
     135 
     136    //TODO I'm omitting noise, s/b Poisson or Gaussian with lots of photons??? 
     137   //TODO I'm omitting residuals, see below also, same thing... 
     138 
     139    private native int RLD_fit(double xInc, 
     140                           double y[], 
     141                           int fitStart, 
     142                           int fitEnd, 
     143                           double instr[], 
     144                           int nInstr, 
     145                           double sig[], 
     146                           double z[], 
     147                           double a[], 
     148                           double tau[], 
     149                           double fitted[], 
     150                           double chiSquare[], 
     151                           double chiSquareTarget 
     152                           ); 
     153 
     154    //TODO I'm omitted noise, see above and restrainType and fitType, for now 
     155    //TODO also covar, alpha, errAxes and chiSqPercent 
     156    //TODO I'm omitting residuals[] aren't residuals = y 0 yFitted??? is there some weighting I'm missing that is time-consuming/impossible to recreate? 
     157 
     158    private native int LMA_fit(double xInc, 
     159                           double y[], 
     160                           int fitStart, 
     161                           int fitEnd, 
     162                           double instr[], 
     163                           int n_instr, 
     164                           double sig[], 
     165                           double param[], 
     166                           int paramFree[], 
     167                           int nParam, 
     168                           double fitted[], 
     169                           double chiSquare[], 
     170                           double chiSquareTarget 
     171                           ); 
    126172 
    127173    public SLIMCurveFitter(AlgorithmType algorithmType) { 
     
    137183    public int fitData(ICurveFitData[] dataArray, int start, int stop) { 
    138184        int returnValue = 0; 
    139         if (null == s_library) { 
     185        IJ.log("SLIMCurveFitter.fitData " + m_algorithmType + " s_loaded " + s_loaded + " dataArray.length " + dataArray.length); 
     186 
     187        //TODO old style: 
     188        if (m_oldStyle) { 
     189             
     190       if (null == s_library) { 
    140191            try { 
    141192                // extract to library path 
     
    256307        //TODO error return deserves much more thought!!  Just returning the last value here!! 
    257308        return returnValue; 
     309 
     310        } 
     311        else { 
     312        //TODO 
     313        if (!s_loaded) { 
     314            try { 
     315                // extract to library path 
     316                //TODO sort out the nameSystem.out.println("extract native library returns " + NativeLibraryUtil.extractNativeLibraryToPath(this.getClass(), "SLIMCurve-2.0-SNAPSHOT")); 
     317                //System.out.println("extract native library returns " + NativeLibraryUtil.extractNativeLibraryToPath(this.getClass(), "slim-curve-1.0-SNAPSHOT")); 
     318 
     319                //System.out.println("loadNativeLibrary returns " + NativeLibraryUtil.loadNativeLibrary(this.getClass(), "slim-curve")); 
     320 
     321                boolean inNetBeans = false; //TODO useful for debugging when running NetBeans, requires dylib to be in slim-plugin directory // true; 
     322                if (inNetBeans) { 
     323                    System.loadLibrary("slim-curve-1.0-SNAPSHOT"); 
     324                    s_loaded = true; 
     325                } 
     326                else { 
     327                    s_loaded = NativeLibraryUtil.loadNativeLibrary(this.getClass(), "slim-curve"); 
     328                } 
     329 
     330                //IJ.log("before System load library"); 
     331               ////// System.loadLibrary("slim-curve-1.0-SNAPSHOT"); 
     332                //IJ.log("after System load library"); 
     333 
     334                // load once, on-demand 
     335                //TODO sort out the name s_library = (CLibrary) Native.loadLibrary("SLIMCurve", CLibrary.class); 
     336               //TODO test with old code instead: s_library = (CLibrary) Native.loadLibrary("slim-curve-1.0-SNAPSHOT", CLibrary.class); 
     337                //TODO this was yet another version s_library = (CLibrary) Native.loadLibrary("SLIMCurve_trimmed_down", CLibrary.class); 
     338                //s_library = (CLibrary) Native.loadLibrary("slim-curve-1.0-SNAPSHOT", CLibrary.class); 
     339 
     340                //System.out.println("s_library is " + s_library); 
     341                System.out.println("s_loaded is " + s_loaded); 
     342                IJ.log("s_loaded is " + s_loaded); 
     343            } 
     344            catch (UnsatisfiedLinkError e) { 
     345                IJ.log("unable to load dynamic library " + e.getMessage()); 
     346                System.out.println("unable to load dynamic library " + e.getMessage()); 
     347                return 0; 
     348            } 
     349        } 
     350        IJ.log("test"); 
     351 
     352        //TODO ARG 9/3/10 these issues still need to be addressed: 
     353 
     354        //TODO ARG since initial x = fit_start * xincr we have to supply the unused portion of y[] before fit_start. 
     355        // if this data were already premassaged it might be better to get rid of fit_start & _end, just give the 
     356        // portion to be fitted and specify an initial x. 
     357        //TODO ARG August use initial X of 0. 
     358 
     359        boolean[] free = m_free.clone(); 
     360        if (AlgorithmType.RLD.equals(m_algorithmType)) { 
     361            // pure RLD (versus RLD followed by LMA) has no way to fix 
     362            // parameters 
     363            for (int i = 0; i < free.length; ++i) { 
     364                free[i] = true; 
     365            } 
     366        } 
     367 
     368        // use array to pass double by reference 
     369        double[] chiSquare = new double[1]; 
     370        double chiSquareTarget = 1.0; //TODO s/b specified incoming 
     371 
     372        if (AlgorithmType.RLD.equals(m_algorithmType) || AlgorithmType.RLD_LMA.equals(m_algorithmType)) { 
     373            // RLD or triple integral fit 
     374 
     375            // use arrays to pass double by reference 
     376            double[] z = new double[1]; 
     377            double[] a = new double[1]; 
     378            double[] tau = new double[1]; 
     379 
     380            for (ICurveFitData data: dataArray) { 
     381                // grab incoming parameters 
     382                a[0] = data.getParams()[2]; 
     383                tau[0] = data.getParams()[3]; 
     384                z[0] = data.getParams()[1]; 
     385 
     386                // get IRF curve, if any 
     387                double[] instrumentResponse = getInstrumentResponse(data.getPixels()); 
     388                int nInstrumentResponse = 0; 
     389                if (null != instrumentResponse) { 
     390                    nInstrumentResponse = instrumentResponse.length; 
     391                } 
     392 
     393          IJ.log("about to do RLD_fit"); 
     394                returnValue = RLD_fit(m_xInc, 
     395                        data.getYCount(), 
     396                        start, 
     397                        stop, 
     398                        instrumentResponse, 
     399                        nInstrumentResponse, 
     400                        data.getSig(), 
     401                        z, 
     402                        a, 
     403                        tau, 
     404                        data.getYFitted(), 
     405                        chiSquare, 
     406                        chiSquareTarget 
     407                        ); 
     408           IJ.log("did RLD_fit"); 
     409                // set outgoing parameters, unless they are fixed 
     410                data.getParams()[0] = chiSquare[0]; 
     411                if (free[0]) { 
     412                    data.getParams()[1] = z[0]; 
     413                } 
     414                if (free[1]) { 
     415                    data.getParams()[2] = a[0]; 
     416                } 
     417                if (free[2]) { 
     418                    data.getParams()[3] = tau[0]; 
     419                } 
     420            } 
     421        } 
     422 
     423        if (AlgorithmType.LMA.equals(m_algorithmType) || AlgorithmType.RLD_LMA.equals(m_algorithmType)) { 
     424            // LMA fit 
     425            for (ICurveFitData data: dataArray) { 
     426                int nInstrumentResponse = 0; 
     427                if (null != m_instrumentResponse) { 
     428                    nInstrumentResponse = m_instrumentResponse.length; 
     429                } 
     430                returnValue = LMA_fit( 
     431                        m_xInc, 
     432                        data.getYCount(), 
     433                        start, 
     434                        stop, 
     435                        m_instrumentResponse, 
     436                        nInstrumentResponse, 
     437                        data.getSig(), 
     438                        data.getParams(), 
     439                        toIntArray(m_free), 
     440                        data.getParams().length - 1, 
     441                        data.getYFitted(), 
     442                        chiSquare, 
     443                        chiSquareTarget 
     444                        ); 
     445            } 
     446        } 
     447        //TODO error return deserves much more thought!!  Just returning the last value here!! 
     448        IJ.log("SLIMCurveFitter.fitData returns " + returnValue); 
     449        return returnValue; 
     450        //TODO old style: 
     451        } 
     452        //TODO 
    258453    } 
    259454 
Note: See TracChangeset for help on using the changeset viewer.