View on GitHub

GECCO-2019-cohort-lexicase

This repository contains materials for our cohort lexicase project.

Hand-coded solutions for programming synthesis benchmark problems

Problem - Number IO

  emp::vector<emp::BitSet<TAG_WIDTH>> matrix = GenHadamardMatrix<TAG_WIDTH>();
  hardware_t::Program sol(inst_lib);
  sol.PushInst("LoadInt", {matrix[0], matrix[0], matrix[0]});
  sol.PushInst("LoadDouble", {matrix[1], matrix[1], matrix[1]});
  sol.PushInst("Add", {matrix[0], matrix[1], matrix[2]});
  sol.PushInst("SubmitNum", {matrix[2], matrix[2], matrix[2]});
  sol.PushInst("Return", {matrix[0], matrix[0], matrix[0]});
  prog_world->Inject(sol, PROG_POP_SIZE);

Problem - Small or Large

  emp::vector<emp::BitSet<TAG_WIDTH>> matrix = GenHadamardMatrix<TAG_WIDTH>();
  hardware_t::Program sol(inst_lib);
  // Create thresholds to compare n to.
  sol.PushInst("Set-10", {matrix[0], matrix[4], matrix[4]});
  sol.PushInst("Set-2",  {matrix[1], matrix[4], matrix[4]});
  sol.PushInst("Mult",   {matrix[0], matrix[0], matrix[2]});
  sol.PushInst("Mult",   {matrix[0], matrix[2], matrix[0]});
  sol.PushInst("Mult",   {matrix[0], matrix[1], matrix[1]});
  // Load input
  sol.PushInst("LoadInt",     {matrix[2], matrix[4], matrix[4]});
  // Check if n < 1000
  sol.PushInst("TestNumLess", {matrix[2], matrix[0], matrix[3]});
  sol.PushInst("If",          {matrix[3], matrix[4], matrix[4]});
  sol.PushInst("SubmitSmall", {matrix[4], matrix[4], matrix[4]});
  sol.PushInst("Return",      {matrix[4], matrix[4], matrix[4]});
  sol.PushInst("Close",       {matrix[4], matrix[4], matrix[4]});
  // Check if n < 2000
  sol.PushInst("TestNumLess", {matrix[2], matrix[1], matrix[3]});
  sol.PushInst("If",          {matrix[3], matrix[4], matrix[4]});
  sol.PushInst("SubmitNone",  {matrix[4], matrix[4], matrix[4]});
  sol.PushInst("Return",      {matrix[4], matrix[4], matrix[4]});
  sol.PushInst("Close",       {matrix[4], matrix[4], matrix[4]});
  // n must be >= 2000
  sol.PushInst("SubmitLarge", {matrix[4], matrix[4], matrix[4]});
  sol.PushInst("Return",      {matrix[4], matrix[4], matrix[4]});
  prog_world->Inject(sol, PROG_POP_SIZE);

Problem - ForLoopIndex

  emp::vector<emp::BitSet<TAG_WIDTH>> matrix = GenHadamardMatrix<TAG_WIDTH>();
  hardware_t::Program sol(inst_lib);

  sol.PushInst("CopyMem",     {matrix[0], matrix[4], matrix[7]});
  sol.PushInst("Inc",         {matrix[5], matrix[7], matrix[7]});
  sol.PushInst("While",       {matrix[5], matrix[7], matrix[7]});
  sol.PushInst("SubmitNum",   {matrix[4], matrix[7], matrix[7]});
  sol.PushInst("Add",         {matrix[4], matrix[2], matrix[4]});
  sol.PushInst("TestNumLess", {matrix[4], matrix[1], matrix[5]});
  sol.PushInst("Close",       {matrix[7], matrix[7], matrix[7]});
  sol.PushInst("Return",      {matrix[7], matrix[7], matrix[7]});

  prog_world->Inject(sol, PROG_POP_SIZE);

Problem - CompareStringLengths

  emp::vector<emp::BitSet<TAG_WIDTH>> matrix = GenHadamardMatrix<TAG_WIDTH>();
  hardware_t::Program sol(inst_lib);

  sol.PushInst("StrLength",   {matrix[0], matrix[0], matrix[4]});
  sol.PushInst("StrLength",   {matrix[1], matrix[1], matrix[4]});
  sol.PushInst("StrLength",   {matrix[2], matrix[2], matrix[4]});
  sol.PushInst("TestNumLess", {matrix[0], matrix[1], matrix[3]});
  sol.PushInst("If",          {matrix[3], matrix[4], matrix[4]});
  sol.PushInst("TestNumLess", {matrix[1], matrix[2], matrix[3]});
  sol.PushInst("If",          {matrix[3], matrix[4], matrix[4]});
  sol.PushInst("SubmitVal",   {matrix[3], matrix[4], matrix[4]});
  sol.PushInst("Close",       {matrix[4], matrix[4], matrix[4]});
  sol.PushInst("Close",       {matrix[4], matrix[4], matrix[4]});
  sol.PushInst("SubmitVal",   {matrix[3], matrix[4], matrix[4]});
  
  prog_world->Inject(sol, PROG_POP_SIZE);

Problem - CollatzNumbers

  emp::vector<emp::BitSet<TAG_WIDTH>> matrix = GenHadamardMatrix<TAG_WIDTH>();
  hardware_t::Program sol(inst_lib);

  sol.PushInst("Inc",           {matrix[1], matrix[8], matrix[8]});
  sol.PushInst("Set-2",         {matrix[2], matrix[8], matrix[8]});
  sol.PushInst("Set-3",         {matrix[3], matrix[8], matrix[8]});
  sol.PushInst("Inc",           {matrix[4], matrix[8], matrix[8]});
  sol.PushInst("TestNumNEqu",   {matrix[1], matrix[0], matrix[5]});
  sol.PushInst("While",         {matrix[5], matrix[8], matrix[8]});
  sol.PushInst(  "Inc",         {matrix[4], matrix[8], matrix[8]});
  sol.PushInst(  "Mod",         {matrix[0], matrix[2], matrix[6]});
  sol.PushInst(  "IfNot",       {matrix[6], matrix[8], matrix[8]});
  sol.PushInst(    "Div",       {matrix[0], matrix[2], matrix[0]});
  sol.PushInst(  "Close",       {matrix[8], matrix[8], matrix[8]});
  sol.PushInst(  "If",          {matrix[6], matrix[8], matrix[8]});
  sol.PushInst(    "Mult",      {matrix[0], matrix[3], matrix[0]});
  sol.PushInst(    "Inc",       {matrix[0], matrix[8], matrix[8]});
  sol.PushInst(  "Close",       {matrix[8], matrix[8], matrix[8]});
  sol.PushInst(  "TestNumNEqu", {matrix[1], matrix[0], matrix[5]});
  sol.PushInst("Close",         {matrix[8], matrix[8], matrix[8]});
  sol.PushInst("SubmitNum",     {matrix[4], matrix[8], matrix[8]});
  
  prog_world->Inject(sol, PROG_POP_SIZE);

Problem - StringLengthsBackwards

  emp::vector<emp::BitSet<TAG_WIDTH>> matrix = GenHadamardMatrix<TAG_WIDTH>();
  hardware_t::Program sol(inst_lib);

  sol.PushInst("LoadStrVec",  {matrix[0], matrix[4], matrix[4]});
  sol.PushInst("VecReverse",  {matrix[0], matrix[4], matrix[4]});
  sol.PushInst("Foreach",     {matrix[1], matrix[0], matrix[4]});
  sol.PushInst(  "StrLength", {matrix[1], matrix[2], matrix[4]});
  sol.PushInst(  "SubmitVal", {matrix[2], matrix[4], matrix[4]});
  sol.PushInst("Close",       {matrix[4], matrix[4], matrix[4]});
  
  prog_world->Inject(sol, PROG_POP_SIZE);

Problem - LastIndexOfZero

  emp::vector<emp::BitSet<TAG_WIDTH>> matrix = GenHadamardMatrix<TAG_WIDTH>();
  hardware_t::Program sol(inst_lib);

  sol.PushInst("LoadVec",     {matrix[0], matrix[4], matrix[4]});
  sol.PushInst("VecReverse",  {matrix[0], matrix[4], matrix[4]});
  sol.PushInst("VecIndexOf",  {matrix[0], matrix[1], matrix[2]});
  sol.PushInst("VecLen",      {matrix[0], matrix[1], matrix[4]});
  sol.PushInst("Sub",         {matrix[1], matrix[2], matrix[3]});
  sol.PushInst("Dec",         {matrix[3], matrix[4], matrix[4]});
  sol.PushInst("SubmitNum",   {matrix[3], matrix[4], matrix[4]});
  
  prog_world->Inject(sol, PROG_POP_SIZE);

Problem - CountOdds

  emp::vector<emp::BitSet<TAG_WIDTH>> matrix = GenHadamardMatrix<TAG_WIDTH>();
  hardware_t::Program sol(inst_lib);

  sol.PushInst("LoadVec",   {matrix[0], matrix[7], matrix[7]});
  sol.PushInst("Set-2",     {matrix[2], matrix[7], matrix[7]});
  sol.PushInst("Foreach",   {matrix[1], matrix[0], matrix[7]});
  sol.PushInst(  "Mod",     {matrix[1], matrix[2], matrix[3]});
  sol.PushInst(  "If",      {matrix[3], matrix[7], matrix[7]});
  sol.PushInst(    "Inc",   {matrix[4], matrix[7], matrix[7]});
  sol.PushInst(  "Close",   {matrix[7], matrix[7], matrix[7]});
  sol.PushInst("Close",     {matrix[7], matrix[7], matrix[7]});
  sol.PushInst("SubmitNum", {matrix[4], matrix[7], matrix[7]});
  
  prog_world->Inject(sol, PROG_POP_SIZE);

Problem - Mirror Image

  emp::vector<emp::BitSet<TAG_WIDTH>> matrix = GenHadamardMatrix<TAG_WIDTH>();
  hardware_t::Program sol(inst_lib);

  sol.PushInst("LoadVec1",   {matrix[0], matrix[7], matrix[7]});
  sol.PushInst("LoadVec2",   {matrix[1], matrix[7], matrix[7]});
  sol.PushInst("VecReverse", {matrix[1], matrix[7], matrix[7]});
  sol.PushInst("TestMemEqu", {matrix[0], matrix[1], matrix[2]});
  sol.PushInst("SubmitVal",  {matrix[2], matrix[7], matrix[7]});
  
  prog_world->Inject(sol, PROG_POP_SIZE);

Problem - Vectors Summed

  emp::vector<emp::BitSet<TAG_WIDTH>> matrix = GenHadamardMatrix<TAG_WIDTH>();
  hardware_t::Program sol(inst_lib);

  sol.PushInst("LoadVec1",      {matrix[0], matrix[8], matrix[8]});
  sol.PushInst("LoadVec2",      {matrix[1], matrix[8], matrix[8]});
  sol.PushInst("VecLen",        {matrix[0], matrix[2], matrix[8]});
  sol.PushInst("Set-0",         {matrix[3], matrix[8], matrix[8]});
  sol.PushInst("TestNumLess",   {matrix[3], matrix[2], matrix[4]});
  sol.PushInst("While",         {matrix[4], matrix[8], matrix[8]});
  sol.PushInst(  "VecGet",      {matrix[0], matrix[3], matrix[5]});
  sol.PushInst(  "VecGet",      {matrix[1], matrix[3], matrix[6]});
  sol.PushInst(  "Add",         {matrix[5], matrix[6], matrix[7]});
  sol.PushInst(  "VecSet",      {matrix[0], matrix[3], matrix[7]});
  sol.PushInst(  "Inc",         {matrix[3], matrix[8], matrix[8]});
  sol.PushInst(  "TestNumLess", {matrix[3], matrix[2], matrix[4]});
  sol.PushInst("Close",         {matrix[8], matrix[8], matrix[8]});
  sol.PushInst("SubmitVec",     {matrix[0], matrix[8], matrix[8]});

  prog_world->Inject(sol, PROG_POP_SIZE);

Problem - Sum of Squares

Closed form solution:

  emp::vector<emp::BitSet<TAG_WIDTH>> matrix = GenHadamardMatrix<TAG_WIDTH>();
  hardware_t::Program sol(inst_lib);

  sol.PushInst("LoadNum",    {matrix[0], matrix[8], matrix[8]});
  sol.PushInst("Set-2",      {matrix[1], matrix[8], matrix[8]});
  sol.PushInst("Set-6",      {matrix[2], matrix[8], matrix[8]});
  sol.PushInst("CopyMem",    {matrix[0], matrix[3], matrix[8]});
  sol.PushInst("Inc",        {matrix[3], matrix[8], matrix[8]});
  sol.PushInst("Mult",       {matrix[0], matrix[3], matrix[4]});
  sol.PushInst("Mult",       {matrix[0], matrix[1], matrix[5]});
  sol.PushInst("Inc",        {matrix[5], matrix[8], matrix[8]});
  sol.PushInst("Mult",       {matrix[4], matrix[5], matrix[6]});
  sol.PushInst("Div",        {matrix[6], matrix[2], matrix[7]});
  sol.PushInst("SubmitNum",  {matrix[7], matrix[8], matrix[8]});
  prog_world->Inject(sol, PROG_POP_SIZE);

Problem - Vector Average

  emp::vector<emp::BitSet<TAG_WIDTH>> matrix = GenHadamardMatrix<TAG_WIDTH>();
  hardware_t::Program sol(inst_lib);

  sol.PushInst("LoadVec",   {matrix[0], matrix[5], matrix[5]});
  sol.PushInst("Foreach",   {matrix[1], matrix[0], matrix[5]});
  sol.PushInst(  "Add",     {matrix[1], matrix[2], matrix[2]});
  sol.PushInst("Close",     {matrix[5], matrix[5], matrix[5]});
  sol.PushInst("VecLen",    {matrix[0], matrix[3], matrix[5]});
  sol.PushInst("Div",       {matrix[2], matrix[3], matrix[4]});
  sol.PushInst("SubmitNum", {matrix[4], matrix[5], matrix[5]});
  
  prog_world->Inject(sol, PROG_POP_SIZE);

Problem - Median

  emp::vector<emp::BitSet<TAG_WIDTH>> matrix = GenHadamardMatrix<TAG_WIDTH>();
  hardware_t::Program sol(inst_lib);

  sol.PushInst("MakeVector",    {matrix[0], matrix[2], matrix[4]});
  sol.PushInst("LoadNum1",      {matrix[5], matrix[0], matrix[0]});
  sol.PushInst("LoadNum1",      {matrix[6], matrix[0], matrix[0]});
  sol.PushInst("Foreach",       {matrix[0], matrix[4], matrix[0]});
  sol.PushInst(  "TestNumLess", {matrix[0], matrix[5], matrix[1]});
  sol.PushInst(  "If",          {matrix[1], matrix[0], matrix[0]});
  sol.PushInst(    "CopyMem",   {matrix[0], matrix[5], matrix[0]});
  sol.PushInst(  "Close",       {matrix[0], matrix[0], matrix[0]});
  sol.PushInst(  "TestNumLess", {matrix[6], matrix[0], matrix[1]});
  sol.PushInst(  "If",          {matrix[1], matrix[0], matrix[0]});
  sol.PushInst(    "CopyMem",   {matrix[0], matrix[6], matrix[0]});
  sol.PushInst(  "Close",       {matrix[0], matrix[0], matrix[0]});
  sol.PushInst(  "Add",         {matrix[0], matrix[7], matrix[7]});
  sol.PushInst("Close",         {matrix[0], matrix[0], matrix[0]});
  sol.PushInst("Sub",           {matrix[7], matrix[5], matrix[7]});
  sol.PushInst("Sub",           {matrix[7], matrix[6], matrix[7]});
  sol.PushInst("SubmitNum",     {matrix[7], matrix[0], matrix[0]});

  prog_world->Inject(sol, PROG_POP_SIZE);

Problem - Smallest

  emp::vector<emp::BitSet<TAG_WIDTH>> matrix = GenHadamardMatrix<TAG_WIDTH>();
  hardware_t::Program sol(inst_lib);

  sol.PushInst("LoadNum1",    {matrix[0], matrix[7], matrix[7]});
  sol.PushInst("LoadNum2",    {matrix[1], matrix[7], matrix[7]});
  sol.PushInst("LoadNum3",    {matrix[2], matrix[7], matrix[7]});
  sol.PushInst("LoadNum4",    {matrix[3], matrix[7], matrix[7]});
  sol.PushInst("MakeVector",  {matrix[0], matrix[3], matrix[4]});
  sol.PushInst("Foreach",     {matrix[5], matrix[4], matrix[7]});
  sol.PushInst("TestNumLess", {matrix[5], matrix[0], matrix[6]});
  sol.PushInst("If",          {matrix[6], matrix[7], matrix[7]});
  sol.PushInst("CopyMem",     {matrix[5], matrix[0], matrix[7]});
  sol.PushInst("Close",       {matrix[7], matrix[7], matrix[7]});
  sol.PushInst("Close",       {matrix[7], matrix[7], matrix[7]});
  sol.PushInst("SubmitNum",   {matrix[0], matrix[7], matrix[7]});
  
  prog_world->Inject(sol, PROG_POP_SIZE);

Problem - Grade

  emp::vector<emp::BitSet<TAG_WIDTH>> matrix = GenHadamardMatrix<TAG_WIDTH>();
  hardware_t::Program sol(inst_lib);
  sol.PushInst("LoadThreshA",        {matrix[0], matrix[8], matrix[8]});
  sol.PushInst("LoadThreshB",        {matrix[1], matrix[8], matrix[8]});
  sol.PushInst("LoadThreshC",        {matrix[2], matrix[8], matrix[8]});
  sol.PushInst("LoadThreshD",        {matrix[3], matrix[8], matrix[8]});
  sol.PushInst("LoadGrade",          {matrix[4], matrix[8], matrix[8]});
  sol.PushInst("TestNumGreaterTEqu", {matrix[4], matrix[0], matrix[5]});
  sol.PushInst("If",                 {matrix[5], matrix[8], matrix[8]});
    sol.PushInst("SubmitA",          {matrix[8], matrix[8], matrix[8]});
    sol.PushInst("Return",           {matrix[8], matrix[8], matrix[8]});
  sol.PushInst("Close",              {matrix[8], matrix[8], matrix[8]});
  sol.PushInst("TestNumGreaterTEqu", {matrix[4], matrix[1], matrix[5]});
  sol.PushInst("If",                 {matrix[5], matrix[8], matrix[8]});
    sol.PushInst("SubmitB",          {matrix[8], matrix[8], matrix[8]});
    sol.PushInst("Return",           {matrix[8], matrix[8], matrix[8]});
  sol.PushInst("Close",              {matrix[8], matrix[8], matrix[8]});
  sol.PushInst("TestNumGreaterTEqu", {matrix[4], matrix[2], matrix[5]});
  sol.PushInst("If",                 {matrix[5], matrix[8], matrix[8]});
    sol.PushInst("SubmitC",          {matrix[8], matrix[8], matrix[8]});
    sol.PushInst("Return",           {matrix[8], matrix[8], matrix[8]});
  sol.PushInst("Close",              {matrix[8], matrix[8], matrix[8]});
  sol.PushInst("TestNumGreaterTEqu", {matrix[4], matrix[3], matrix[5]});
  sol.PushInst("If",                 {matrix[5], matrix[8], matrix[8]});
    sol.PushInst("SubmitD",          {matrix[8], matrix[8], matrix[8]});
    sol.PushInst("Return",           {matrix[8], matrix[8], matrix[8]});
  sol.PushInst("Close",              {matrix[8], matrix[8], matrix[8]});
  sol.PushInst("SubmitF",            {matrix[8], matrix[8], matrix[8]});
  
  prog_world->Inject(sol, PROG_POP_SIZE);