Results 1 to 2 of 2

Thread: Groovy and JMSL

  1. #1
    Senior Member ed's Avatar
    Join Date
    Aug 2005
    Posts
    312

    Groovy and JMSL

    This topic came up again briefly this morning, so I figured I'll post something quickly on it. I have played around with Groovy a little (others in the company more so), but find it a very interesting environment. Being so closely integrated with Java, it's quite easy to utilize the JMSL Library from the Groovy framework.

    While I haven't written any real applications, using the GroovyConsole I have successfully called JMSL functions. On the installation side, it's easiest to copy the jmsl.jar archive into the groovy/lib directory so it is automatically included in the classpath. A system-wide CLASSPATH variable would also work. Then you can start up the GroovyConsole application and try some things out.

    For example, my favorite basic starting point of calling a static function is the Error Function in the special functions class of the math package. In Groovy, this is as simple as:

    import com.imsl.math.Sfun
    println(Sfun.erf(0.5))


    which gives the output as:

    groovy> import com.imsl.math.Sfun
    groovy> println(Sfun.erf(0.5))

    0.5204998778130465


    Couldn't be simpler! Stepping up to actually creating an object is just as easy. I'm sure some of this could be written more Groovy-like instead of Java-like, but the point is that it all works:

    double[][] a = [[1, 3, 3],[1, 3, 4],[1, 4, 3]]
    double[] b = [12, 13, 14]
    import com.imsl.math.*
    lu = new LU(a)
    x = lu.solve(b)
    //new PrintMatrix("x").print(x)
    println("x = " + x)
    ainv = lu.inverse()
    new PrintMatrix("a inv").print(ainv)


    And this generates the following output (ignoring the echo of the statements in the script). Using a 'code' tag here to retain the formatting of the output matrix.
    Code:
    x = [3.000000000000001, 2.0, 1.0]
         a inv
       0   1   2   
    0   7  -3  -3  
    1  -1   0   1  
    2  -1   1   0

    And so there you have it. Get the jmsl.jar file on the classpath and import packages as usual.


    The first 90% of the code accounts for the first 90% of the development time. The remaining 10% of the code accounts for the other 90% of the development time.

  2. #2
    Senior Member ed's Avatar
    Join Date
    Aug 2005
    Posts
    312

    And now for charting

    Charting can be used easily as well. Here we use the Groovy SwingBuilder along with a JMSL JPanelChart to create a pie chart with colors and labels. The code is still pretty Java-ish, but I'm slowly learning Groovy. The i++ inside the each() block doesn't feel needed, but I don't see how else you'd index into the colors and titles lists.

    And I should mention this is adapted from the JMSL PieChart example and from an example on the Groovy Cookbook Examples page.

    Code:
    import com.imsl.chart.*
    import groovy.swing.SwingBuilder
    import java.awt.*
    import javax.swing.WindowConstants as WC
    
    // build the data
    double[] y = [10, 20, 30, 40]
    def colors = [Color.red, Color.blue, Color.green, Color.yellow]
    def titles = ["Fish", "Pork", "Poultry", "Beef"]
    
    // create the chart objects
    def chart = new Chart()
    def pie = new Pie(chart, y)
    pie.setLabelType(Pie.LABEL_TYPE_TITLE)
    slice = pie.getPieSlice()
    
    // set the slice properties
    i = 0
    slice.each() {
      it.setFillColor(colors[i])
      it.setTitle(titles[i])
      i++
    }
    slice[0].setExplode(0.2)
    
    // build the gui and show it
    def swing = new SwingBuilder()
    def jPanelChart = new JPanelChart(chart)
    jPanelChart.setPreferredSize(new Dimension(500,500))
    def frame = swing.frame(title:'Groovy PieChart',
            defaultCloseOperation:WC.DISPOSE_ON_CLOSE) {
        panel(id:'canvas') { widget(jPanelChart) }
    }
    frame.pack()
    frame.show()


    The first 90% of the code accounts for the first 90% of the development time. The remaining 10% of the code accounts for the other 90% of the development time.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •