import sys
sys.dont_write_bytecode=True
from model  import *

class Schaffer(Model):
  "A very simple model."
  def has(i):
    return [Num("$x1",lo=-10,hi=10),
            Num("<f1"),
            Num("<f2")]
  def score(i,l):
    x = i.get(l,"x1")
    i.put(l, "f1", x**2)
    i.put(l, "f2", (x-2)**2)
    
class Kursawe(Model):
  "A model with 8 decisions and 2 objectives."
  def has(i):
    return [Num("$x1",lo = -5,hi = 5),
            Num("$x2",lo = -5,hi = 5),
            Num("$x3",lo = -5,hi = 5),
            Num("$x4",lo = -5,hi = 5),
            Num("$x5",lo = -5,hi = 5),
            Num("$x6",lo = -5,hi = 5),
            Num("$x7",lo = -5,hi = 5),
            Num("$x8",lo = -5,hi = 5),
            Num("<f1"),
            Num("<f2")]
  def score(i,l):
    f1 = f2 = 0.0
    for n,one in enumerate(l[:7]):
      two = l[n+1]
      f1 += -10*e**(-0.2*(one**2 + two**2)**0.5)
    for one in l[:8]:
      f2 += abs(one)**0.8 + 5*math.sin(one**3)
    i.put(l,"f1",f1)
    i.put(l,"f2",f2)

def run(what=Schaffer,repeats=10):
  """Note that the high-level loop is generic
   to all models."""
  x=what()
  for _ in range(repeats):
    print x.any()
  for col in x.t.columns:
    print col

def schafferd(): run(Schaffer)
def kursawed() : run(Kursawe)
