{
  "version": "https://jsonfeed.org/version/1.1",
  "title": "chem-bla-ics",
  "description": "Chemblaics (pronounced chem-bla-ics) is the science that uses open science and computers to solve problems in chemistry, biochemistry and related fields.",
  "home_page_url": "https://chem-bla-ics.linkedchemistry.info/",
  "feed_url": "https://chem-bla-ics.linkedchemistry.info/2007/05/30/weka-decision-trees-to-java-conversion.json",
  "icon": "https://chem-bla-ics.linkedchemistry.info/assets/images/chem-bla-ics_logo.png",
  "language": "en",
  "authors": [
    {
      "name": "Egon Willighagen",
      "url": "https://orcid.org/0000-0001-7542-0286",
      "_orcid": "0000-0001-7542-0286"
    }
  ],
  "items": [

    {
      "id": "https://doi.org/10.59350/bnwdb-pa057",
      "url": "https://chem-bla-ics.linkedchemistry.info/2007/05/30/weka-decision-trees-to-java-conversion.html",
      "title": "Weka Decision Trees to Java Conversion",
      "content_html": "<p>Some time ago I wrote a small Perl script to convert a decision tree created with <a href=\"http://www.cs.waikato.ac.nz/~ml/weka/\">Weka</a> in the\n<a href=\"http://www.cs.waikato.ac.nz/~ml/weka/arff.html\">ARFF format</a> to Java source code, for use in the\n<a href=\"http://cheminfo.informatics.indiana.edu/~rguha/code/java/nightly/api/org/openscience/cdk/qsar/descriptors/molecular/IPMolecularDescriptor.html\">ionization potential prediction</a>\nin <a href=\"http://cdk.sf.net/\">CDK</a>. The advantage is that Weka is no longer used are runtime, and that there is no model that needs to be loaded and interpreted. Instead, it is simple Java code that does the work, much faster.</p>\n\n<p>This is the code:</p>\n\n<div class=\"language-perl highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\">#!/usr/bin/perl</span>\n<span class=\"c1\">#</span>\n<span class=\"c1\"># Copyright 2007 (C) Egon Willighagen</span>\n<span class=\"c1\"># License: GPL</span>\n\n<span class=\"k\">use</span> <span class=\"nv\">diagnostics</span><span class=\"p\">;</span>\n<span class=\"k\">use</span> <span class=\"nv\">strict</span><span class=\"p\">;</span>\n\n<span class=\"k\">my</span> <span class=\"nv\">$filename</span> <span class=\"o\">=</span> <span class=\"nv\">$ARGV</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">];</span>\n\n<span class=\"k\">print</span> <span class=\"p\">\"</span><span class=\"s2\">double result = 0.0;</span><span class=\"se\">\\n</span><span class=\"p\">\";</span>\n<span class=\"nb\">open</span><span class=\"p\">(</span><span class=\"nv\">INPUT</span><span class=\"p\">,</span> <span class=\"p\">\"</span><span class=\"s2\">&lt;</span><span class=\"si\">$filename</span><span class=\"p\">\");</span>\n<span class=\"k\">my</span> <span class=\"nv\">$level</span> <span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span>\n<span class=\"k\">my</span> <span class=\"nv\">$prevLevel</span> <span class=\"o\">=</span> <span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">;</span>\n<span class=\"k\">while</span> <span class=\"p\">(</span><span class=\"k\">my</span> <span class=\"nv\">$line</span> <span class=\"o\">=</span> <span class=\"o\">&lt;</span><span class=\"nv\">INPUT</span><span class=\"o\">&gt;</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n  <span class=\"nv\">$line</span> <span class=\"o\">=~</span> <span class=\"sr\">s/\\n//g</span><span class=\"p\">;</span>\n  <span class=\"nv\">$level</span> <span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span>\n  <span class=\"k\">while</span> <span class=\"p\">(</span><span class=\"nv\">$line</span> <span class=\"o\">=~</span> <span class=\"sr\">/^\\|\\s*(.*)/</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n    <span class=\"nv\">$level</span><span class=\"o\">++</span><span class=\"p\">;</span>\n    <span class=\"nv\">$line</span> <span class=\"o\">=</span> <span class=\"err\">$</span><span class=\"mi\">1</span><span class=\"p\">;</span>\n  <span class=\"p\">}</span>\n  <span class=\"k\">my</span> <span class=\"nv\">$else</span> <span class=\"o\">=</span> <span class=\"p\">\"\";</span>\n  <span class=\"k\">if</span> <span class=\"p\">(</span><span class=\"nv\">$prevLevel</span> <span class=\"o\">==</span> <span class=\"nv\">$level</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n    <span class=\"nv\">$else</span> <span class=\"o\">=</span> <span class=\"p\">\"</span><span class=\"s2\">else </span><span class=\"p\">\";</span>\n  <span class=\"p\">}</span> <span class=\"k\">elsif</span> <span class=\"p\">(</span><span class=\"nv\">$prevLevel</span> <span class=\"o\">&lt;</span> <span class=\"nv\">$level</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n    <span class=\"c1\"># we increase one level at a time</span>\n    <span class=\"k\">for</span> <span class=\"p\">(</span><span class=\"k\">my</span> <span class=\"nv\">$i</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">;</span> <span class=\"nv\">$i</span><span class=\"o\">&lt;</span><span class=\"p\">(</span><span class=\"nv\">$level</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">);</span> <span class=\"nv\">$i</span><span class=\"o\">++</span><span class=\"p\">)</span> <span class=\"p\">{</span> <span class=\"k\">print</span> <span class=\"p\">\"</span><span class=\"s2\">  </span><span class=\"p\">\";</span> <span class=\"p\">};</span>\n    <span class=\"k\">print</span> <span class=\"p\">\"</span><span class=\"s2\">{</span><span class=\"se\">\\n</span><span class=\"p\">\";</span>\n    <span class=\"nv\">$prevLevel</span> <span class=\"o\">=</span> <span class=\"nv\">$level</span><span class=\"p\">;</span>\n  <span class=\"p\">}</span> <span class=\"k\">else</span> <span class=\"p\">{</span>\n    <span class=\"c1\"># this is a bit more tricky: we possibly need more than</span>\n    <span class=\"c1\"># one end bracket</span>\n    <span class=\"k\">my</span> <span class=\"nv\">$diff</span> <span class=\"o\">=</span> <span class=\"nv\">$prevLevel</span> <span class=\"o\">-</span> <span class=\"nv\">$level</span><span class=\"p\">;</span>\n    <span class=\"k\">for</span> <span class=\"p\">(</span><span class=\"k\">my</span> <span class=\"nv\">$closes</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">;</span> <span class=\"nv\">$closes</span><span class=\"o\">&lt;</span><span class=\"nv\">$diff</span><span class=\"p\">;</span> <span class=\"nv\">$closes</span><span class=\"o\">++</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n      <span class=\"k\">for</span> <span class=\"p\">(</span><span class=\"k\">my</span> <span class=\"nv\">$i</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">;</span> <span class=\"nv\">$i</span><span class=\"o\">&lt;</span><span class=\"p\">(</span><span class=\"nv\">$prevLevel</span><span class=\"o\">-</span><span class=\"nv\">$closes</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">);</span> <span class=\"nv\">$i</span><span class=\"o\">++</span><span class=\"p\">)</span> <span class=\"p\">{</span> <span class=\"k\">print</span> <span class=\"p\">\"</span><span class=\"s2\">  </span><span class=\"p\">\";</span> <span class=\"p\">};</span>\n      <span class=\"k\">print</span> <span class=\"p\">\"</span><span class=\"s2\">}</span><span class=\"se\">\\n</span><span class=\"p\">\";</span>\n    <span class=\"p\">}</span>\n    <span class=\"nv\">$prevLevel</span> <span class=\"o\">=</span> <span class=\"nv\">$level</span><span class=\"p\">;</span>\n  <span class=\"p\">}</span>\n  <span class=\"k\">if</span> <span class=\"p\">(</span><span class=\"nv\">$line</span> <span class=\"o\">=~</span> <span class=\"sr\">/:/</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n    <span class=\"k\">my</span> <span class=\"p\">(</span><span class=\"nv\">$if</span><span class=\"p\">,</span> <span class=\"nv\">$then</span><span class=\"p\">)</span> <span class=\"o\">=</span> <span class=\"nb\">split</span><span class=\"p\">(\"</span><span class=\"s2\">:</span><span class=\"p\">\",</span><span class=\"nv\">$line</span><span class=\"p\">);</span>\n    <span class=\"k\">for</span> <span class=\"p\">(</span><span class=\"k\">my</span> <span class=\"nv\">$i</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">;</span> <span class=\"nv\">$i</span><span class=\"o\">&lt;</span><span class=\"nv\">$level</span><span class=\"p\">;</span> <span class=\"nv\">$i</span><span class=\"o\">++</span><span class=\"p\">)</span> <span class=\"p\">{</span> <span class=\"k\">print</span> <span class=\"p\">\"</span><span class=\"s2\">  </span><span class=\"p\">\";</span> <span class=\"p\">};</span>\n    <span class=\"c1\"># FIXME: java-fy $then</span>\n    <span class=\"k\">if</span> <span class=\"p\">(</span><span class=\"nv\">$then</span> <span class=\"o\">=~</span> <span class=\"sr\">/([\\d|_]*)\\s*\\(([^\\)]*)\\)/</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n      <span class=\"k\">my</span> <span class=\"nv\">$result</span> <span class=\"o\">=</span> <span class=\"err\">$</span><span class=\"mi\">1</span><span class=\"p\">;</span>\n      <span class=\"k\">my</span> <span class=\"nv\">$stats</span> <span class=\"o\">=</span> <span class=\"err\">$</span><span class=\"mi\">2</span><span class=\"p\">;</span>\n      <span class=\"nv\">$result</span> <span class=\"o\">=~</span> <span class=\"sr\">s/_/\\./g</span><span class=\"p\">;</span>\n      <span class=\"k\">print</span> <span class=\"nv\">$else</span> <span class=\"o\">.</span> <span class=\"p\">\"</span><span class=\"s2\">if (</span><span class=\"si\">$if</span><span class=\"s2\">) { result = </span><span class=\"si\">$result</span><span class=\"s2\">; // </span><span class=\"si\">$stats</span><span class=\"s2\"> }</span><span class=\"se\">\\n</span><span class=\"p\">\";</span>\n    <span class=\"p\">}</span> <span class=\"k\">else</span> <span class=\"p\">{</span>\n      <span class=\"k\">print</span> <span class=\"nv\">$else</span> <span class=\"o\">.</span> <span class=\"p\">\"</span><span class=\"s2\">if (</span><span class=\"si\">$if</span><span class=\"s2\">) { result = </span><span class=\"si\">$then</span><span class=\"s2\">; }</span><span class=\"se\">\\n</span><span class=\"p\">\";</span>\n    <span class=\"p\">}</span>\n  <span class=\"p\">}</span> <span class=\"k\">else</span> <span class=\"p\">{</span>\n    <span class=\"k\">for</span> <span class=\"p\">(</span><span class=\"k\">my</span> <span class=\"nv\">$i</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">;</span> <span class=\"nv\">$i</span><span class=\"o\">&lt;</span><span class=\"nv\">$level</span><span class=\"p\">;</span> <span class=\"nv\">$i</span><span class=\"o\">++</span><span class=\"p\">)</span> <span class=\"p\">{</span> <span class=\"k\">print</span> <span class=\"p\">\"</span><span class=\"s2\">  </span><span class=\"p\">\";</span> <span class=\"p\">};</span>\n    <span class=\"k\">print</span> <span class=\"nv\">$else</span> <span class=\"o\">.</span> <span class=\"p\">\"</span><span class=\"s2\">if (</span><span class=\"si\">$line</span><span class=\"s2\">)</span><span class=\"se\">\\n</span><span class=\"p\">\";</span>\n  <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n\n<span class=\"c1\"># OK, now add the rest of the closing brackets</span>\n<span class=\"k\">for</span> <span class=\"p\">(</span><span class=\"k\">my</span> <span class=\"nv\">$closes</span><span class=\"o\">=</span><span class=\"nv\">$prevLevel</span><span class=\"p\">;</span> <span class=\"nv\">$closes</span><span class=\"o\">&gt;</span><span class=\"mi\">0</span><span class=\"p\">;</span> <span class=\"nv\">$closes</span><span class=\"o\">--</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n  <span class=\"k\">for</span> <span class=\"p\">(</span><span class=\"k\">my</span> <span class=\"nv\">$i</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">;</span> <span class=\"nv\">$i</span><span class=\"o\">&lt;</span><span class=\"p\">(</span><span class=\"nv\">$closes</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">);</span> <span class=\"nv\">$i</span><span class=\"o\">++</span><span class=\"p\">)</span> <span class=\"p\">{</span> <span class=\"k\">print</span> <span class=\"p\">\"</span><span class=\"s2\">  </span><span class=\"p\">\";</span> <span class=\"p\">};</span>\n  <span class=\"k\">print</span> <span class=\"p\">\"</span><span class=\"s2\">}</span><span class=\"se\">\\n</span><span class=\"p\">\";</span>\n<span class=\"p\">}</span>\n</code></pre></div></div>",
      "summary": "Some time ago I wrote a small Perl script to convert a decision tree created with Weka in the ARFF format to Java source code, for use in the ionization potential prediction in CDK. The advantage is that Weka is no longer used are runtime, and that there is no model that needs to be loaded and interpreted. Instead, it is simple Java code that does the work, much faster.",
      
      "date_published": "2007-05-30T00:10:00+00:00",
      "date_modified": "2025-02-15T00:00:00+00:00",
      "tags": ["java","cheminf","cdk"],
      
      
      
      
      
      
        "authors": [ { "name": "Egon Willighagen", "url": "https://orcid.org/0000-0001-7542-0286" } ]
      
    }

  ]
}
