

Clojure: Genetic Mona Lisa problem in 250 beautiful lines - ynd
http://npcontemplation.blogspot.com/2009/01/clojure-genetic-mona-lisa-problem-in.html

======
tlrobinson
_"Lambdas are not garbage collected.

Yes. That means lambdas can be the cause of memory leaks.

As described by Charles Nutter, each lambda in Clojure is an anonymous class
in Java. The problem is that classes are never garbage collected. They reside
in a special place called the PermGen."_

I know very little about Clojure, but that seems like a _huge_ problem for
Clojure, and other functional-ish JVM languages. Is it?

I've used Rhino (JavaScript on JVM) extensively, and I don't think it suffers
from this.

~~~
jstraszheim
He means the _compiled code_ of a lambda can't be GC'ed. He was creating new
functions inside of an eval.

The individual _closures_ created as code executes are GC'ed like everything
else.

Since eval is rather specialized, and everyone recommends it be avoided in
"normal" code, this is not a major problem.

Plus, it is fixed.

------
dreish
In this thread:

[http://markmail.org/message/axarlob7wwmnm2xe#query:clojure%2...](http://markmail.org/message/axarlob7wwmnm2xe#query:clojure%20permgen+page:1+mid:axarlob7wwmnm2xe+state:results)

Rich Hickey claims that the PermGen issue alleged in this article doesn't
actually exist. A new class is created every time a (fn) is compiled, but only
a new instance of that class is created each time it is invoked.

The only thing that generates a new class each time it is called is (eval),
which as we all remember from reading our PG, is generally regarded as suspect
when used in production code. Obviously you can see this effect at the Clojure
REPL, however.

~~~
Zak
Genetic programming generally won't appear in production code, though it might
be used to generate production code. Using eval seems reasonable in the
context of executing code generated by your program. I'd be interested in
hearing about alternatives.

In response to this problem, Clojure now uses an ephemeral classloader. I
don't know the JVM that well, but Rich Hickey says this means the anonymous
classes generated by evaling fn forms can be collected.

~~~
michaelneale
if all the classes in the classloader are no longer referenced, and there are
no references to the classloader itself, then they will all be GCed (but often
there is a ref to the classloader that causes the PermGen issue).

------
yters
For those interested in GP, here is Koza's course page (pdfs & source):

<http://www.genetic-programming.com/coursemainpage.html>

Koza "invented" GP. However, parent article is really describing Evolutionary
Programming, invented by Fogel in the 1960s. The difference? Ostensibly, no
crossover operator in EP, only mutation.

<http://www.scholarpedia.org/article/Evolutionary_programming>

------
smanek
Incidentally, I wrote the same thing for a class recently in Common Lisp. See
<http://github.com/smanek/ga>

The biggest portion of the code was the bitmap/image manipulation libraries.
Excluding those, it was about the same size.

~~~
apgwoz
... how long did you let it run? The results in the presentation did not turn
out very well.

~~~
smanek
Did you look at the videos, or just the static pictures? The static pictures
are just screenshots taken halfway through the videos.

You can see my videos at: <http://www.youtube.com/watch?v=S1ZPSbImvFE>
<http://www.youtube.com/watch?v=-_VFZ_ON0A8>
<http://www.youtube.com/watch?v=VbyQomrJSeU>

Due to time constraints (I underestimated the time it would take to write a
fast bitmap/polygon library) I only let those simulations run for ~1 hr each.

~~~
ynd
I love the evolution of McCarthy!

~~~
GeoJawDguJin
Someone should do Paul Graham, so he can write a new lisp dialect to write
another program to evolve another version of Paul Graham to write a new lisp
dialect to write another program to evolve another version of Paul Graham to
write a new lisp dialect to write another program to evolve another version of
Paul Graham to write a new lisp dialect to...

------
paulgb
In the informal algorithm description, it says "Create Children from the best
programs by mating and mutating them". By mating, do you mean actually taking
two (or more) "programs" and merging the contents? I looked over the code, but
I don't know enough clojure to find any part that looked like it merged two
programs.

Incidentally, now I want to learn clojure :).

~~~
Zak
I do know Clojure and I didn't see any mating either - just mutating. I
haven't had any caffeine yet though.

I'm also working on genetic programming in Clojure, and with the PermGen fix
in rev. 1232, it seems to be a great tool for the job.

------
biohacker42
As python is beautiful, lisp is parenthesis-y.

Has anyone thought about a Lisp dialect that uses white space, like Python, to
get rid of the ()?

~~~
nihilocrat
Make an editor which will randomly color-code each set of parentheses such
that they or their background is in a set of colors which don't appear as
other keywords (like function defs or strings or whatever) so as not to add
confusion. You now have a way of more easily seeing every matching pair of
parens without having to hover over each one. However, now you have to deal
with a strange assortment of colors on your screen.

Oh wait, you can just use a gradient of colors instead of random ones, with
the more-nested paren pairs having colors farther in on the gradient. Silly
me.

~~~
riobard
"Oh wait, you can just use a gradient of colors instead of random ones, with
the more-nested paren pairs having colors farther in on the gradient. Silly
me."

Good idea! Is it doable in VIM now? :|

------
peregrine
I like this, it gives a clear set of code with a simple non important purpose.

Neat.

------
toodlestech
This has already been done and much better at that. Don't give props to
someone copying anothers work a half year after the fact.

Credit and originality goes to : [http://rogeralsing.com/2008/12/07/genetic-
programming-evolut...](http://rogeralsing.com/2008/12/07/genetic-programming-
evolution-of-mona-lisa/)

~~~
smanek
The author of this article links to that same post and gives credit to Roger
Alsing.

He was just using it as a demonstration of Clojure, nothing more.

Read the article before criticizing.

