logo contest

classic Classic list List threaded Threaded
23 messages Options
12
Reply | Threaded
Open this post in threaded view
|

Re: logo contest

Mike Klaas

On 10-Dec-08, at 12:41 PM, Yonik Seeley wrote:

>>>
>>> Sure thing.
>>
>> I take it that there are no objections?  If so, I'll call a vote by  
>> the end
>> of the week.
>
> +1
> I just wish we had used this method with the community vote.
>
> I guess as a committer I should try and figure out what order the
> community would have voted and do that.

I could run the results of the community vote interpreted as STV, if  
that would help (it'll be a few days, though).

-Mike
Reply | Threaded
Open this post in threaded view
|

Re: logo contest

Ryan McKinley
I added some more math to the script I used to generate the results  
page...  and what do you know: no official winner by any of the  
methods!  (assuming my math is correct)

check:
http://people.apache.org/~ryan/solr-logo-results.html
for a variety of attempts.

The problem with the STV method is that it continues until you meed a  
quota: (votes/seats+1)+1, in our case (19/2)+1=10.  Nothing ever gets  
to 10, so you will notice that stv==votes for everything!

So the next option is to try instant runoff voting:
http://en.wikipedia.org/wiki/Instant-runoff_voting

in that method, the losers of each round is tossed out and the vote  
continues until there is a majority.  Again, we never reach a  
majority, but the last two logos to lose are:
eliminating (4) https://issues.apache.org/jira/secure/attachment/12394264/apache_solr_a_red.jpg
eliminating (4) https://issues.apache.org/jira/secure/attachment/12394070/sslogo-solr-finder2.0.png

Other things to perhaps consider.  Using the "scoring" method,
https://issues.apache.org/jira/secure/attachment/12394070/sslogo-solr-finder2.0.png
is the winner.

The STV or vote counting method puts
https://issues.apache.org/jira/secure/attachment/12394264/apache_solr_a_red.jpg
or
https://issues.apache.org/jira/secure/attachment/12394264/apache_solr_b_red.jpg
at the top.

If we only count the first round of voting
https://issues.apache.org/jira/secure/attachment/12394070/sslogo-solr-finder2.0.png
wins followed by:
https://issues.apache.org/jira/secure/attachment/12394264/apache_solr_a_red.jpg
https://issues.apache.org/jira/secure/attachment/12394264/apache_solr_b_red.jpg

There you go.  clear as mud!

As I see it, we either call a new community poll -- nothing in the  
rules says we can't.  or vote on:

1. https://issues.apache.org/jira/secure/attachment/12394070/sslogo-solr-finder2.0.png
last eliminated by instant runoff and it won the 'soring' method

2. https://issues.apache.org/jira/secure/attachment/12394264/apache_solr_a_red.jpg
last eliminated by instant runoff and *may* have won if the other  
similar logos were not involved.

ryan

here is the hacked up code if you are curious...



     String[][] v = new String[][] {
       {
        "https://issues.apache.org/jira/secure/attachment/12394267/apache_solr_c_blue.jpg 
",
        "https://issues.apache.org/jira/secure/attachment/12394265/apache_solr_b_blue.jpg 
",
        "https://issues.apache.org/jira/secure/attachment/12394263/apache_solr_a_blue.jpg 
",
       },
       {
        "https://issues.apache.org/jira/secure/attachment/12394282/solr2_maho_impression.png 
",
        "https://issues.apache.org/jira/secure/attachment/12394366/solr3_maho.png 
",
        "https://issues.apache.org/jira/secure/attachment/12394264/apache_solr_a_red.jpg 
",
        "https://issues.apache.org/jira/secure/attachment/12394266/apache_solr_b_red.jpg 
",
        "https://issues.apache.org/jira/secure/attachment/12394218/solr-solid.png 
",
       },
       {
        "https://issues.apache.org/jira/secure/attachment/12394218/solr-solid.png 
",
        "https://issues.apache.org/jira/secure/attachment/12394376/solr_sp.png 
",
        "https://issues.apache.org/jira/secure/attachment/12393951/sslogo-solr-classic.png 
",
        "https://issues.apache.org/jira/secure/attachment/12391946/apache_solr_burning.png 
",
        "https://issues.apache.org/jira/secure/attachment/12392306/apache_solr_sun.png 
",
       },
       {
        "https://issues.apache.org/jira/secure/attachment/12394267/apache_solr_c_blue.jpg 
",
        "https://issues.apache.org/jira/secure/attachment/12394268/apache_solr_c_red.jpg 
",

        "https://issues.apache.org/jira/secure/attachment/12394282/solr2_maho_impression.png 
",
        "https://issues.apache.org/jira/secure/attachment/12394366/solr3_maho.png 
",
        "https://issues.apache.org/jira/secure/attachment/12393936/logo_remake.jpg 
",
       },
       {
        "https://issues.apache.org/jira/secure/attachment/12394282/solr2_maho_impression.png 
",
       },
       {
        "https://issues.apache.org/jira/secure/attachment/12394282/solr2_maho_impression.png 
",
        "https://issues.apache.org/jira/secure/attachment/12394475/solr2_maho-vote.png 
",
        "https://issues.apache.org/jira/secure/attachment/12394268/apache_solr_c_red.jpg 
",
       },
       {
        "https://issues.apache.org/jira/secure/attachment/12394263/apache_solr_a_blue.jpg 
",
        "https://issues.apache.org/jira/secure/attachment/12394282/solr2_maho_impression.png 
",
       },
       {
        "https://issues.apache.org/jira/secure/attachment/12394282/solr2_maho_impression.png 
",
        "https://issues.apache.org/jira/secure/attachment/12394266/apache_solr_b_red.jpg 
",
       },
       {
        "https://issues.apache.org/jira/secure/attachment/12394070/sslogo-solr-finder2.0.png 
",
        "https://issues.apache.org/jira/secure/attachment/12394282/solr2_maho_impression.png 
",
        "https://issues.apache.org/jira/secure/attachment/12394353/solr.s5.jpg 
",
        "https://issues.apache.org/jira/secure/attachment/12394264/apache_solr_a_red.jpg 
",
       },
       {
        "https://issues.apache.org/jira/secure/attachment/12394282/solr2_maho_impression.png 
",
        "https://issues.apache.org/jira/secure/attachment/12394376/solr_sp.png 
",
        "https://issues.apache.org/jira/secure/attachment/12393936/logo_remake.jpg 
",
        "https://issues.apache.org/jira/secure/attachment/12394264/apache_solr_a_red.jpg 
",
        "https://issues.apache.org/jira/secure/attachment/12394353/solr.s5.jpg 
",
       },
       {
        "https://issues.apache.org/jira/secure/attachment/12394282/solr2_maho_impression.png 
",
       },
       {
        "https://issues.apache.org/jira/secure/attachment/12394264/apache_solr_a_red.jpg 
",
        "https://issues.apache.org/jira/secure/attachment/12394282/solr2_maho_impression.png 
",
        "https://issues.apache.org/jira/secure/attachment/12394266/apache_solr_b_red.jpg 
",
        "https://issues.apache.org/jira/secure/attachment/12394353/solr.s5.jpg 
",
       },
       {
        "https://issues.apache.org/jira/secure/attachment/12394266/apache_solr_b_red.jpg 
",
        "https://issues.apache.org/jira/secure/attachment/12394314/apache_soir_001.jpg 
",
       },
       {
        "https://issues.apache.org/jira/secure/attachment/12394165/solr-logo.png 
",
        "https://issues.apache.org/jira/secure/attachment/12391987/solr.png 
",
        "https://issues.apache.org/jira/secure/attachment/12392306/apache_solr_sun.png 
",
        "https://issues.apache.org/jira/secure/attachment/12394282/solr2_maho_impression.png 
",
        "https://issues.apache.org/jira/secure/attachment/12394376/solr_sp.png 
",
       },
       {
        "https://issues.apache.org/jira/secure/attachment/12394070/sslogo-solr-finder2.0.png 
",
        "https://issues.apache.org/jira/secure/attachment/12394165/solr-logo.png 
",
        "https://issues.apache.org/jira/secure/attachment/12394266/apache_solr_b_red.jpg 
",
        "https://issues.apache.org/jira/secure/attachment/12394282/solr2_maho_impression.png 
",
       },
       {
        "https://issues.apache.org/jira/secure/attachment/12394264/apache_solr_a_red.jpg 
",
       },
       { /
         "https://issues.apache.org/jira/secure/attachment/12394218/solr-solid.png 
",
         "https://issues.apache.org/jira/secure/attachment/12394070/sslogo-solr-finder2.0.png 
",
         "https://issues.apache.org/jira/secure/attachment/12391946/apache_solr_burning.png 
",
         "https://issues.apache.org/jira/secure/attachment/12394282/solr2_maho_impression.png 
",
       },
       {
         "https://issues.apache.org/jira/secure/attachment/12394070/sslogo-solr-finder2.0.png 
",
         "https://issues.apache.org/jira/secure/attachment/12394475/solr2_maho-vote.png 
",
         "https://issues.apache.org/jira/secure/attachment/12393995/sslogo-solr-70s.png 
"
       },
       {
         "https://issues.apache.org/jira/secure/attachment/12394350/solr.s4.jpg 
",
         "https://issues.apache.org/jira/secure/attachment/12394268/apache_solr_c_red.jpg 
",
         "https://issues.apache.org/jira/secure/attachment/12393995/sslogo-solr-70s.png 
",
         "https://issues.apache.org/jira/secure/attachment/12393936/logo_remake.jpg 
",
       },
       {
         "https://issues.apache.org/jira/secure/attachment/12394165/solr-logo.png 
",
         "https://issues.apache.org/jira/secure/attachment/12394475/solr2_maho-vote.png 
",
         "https://issues.apache.org/jira/secure/attachment/12394350/solr.s4.jpg 
",
         "https://issues.apache.org/jira/secure/attachment/12394282/solr2_maho_impression.png 
",
         "https://issues.apache.org/jira/secure/attachment/12394314/apache_soir_001.jpg 
",
       },
       {
         "https://issues.apache.org/jira/secure/attachment/12394268/apache_solr_c_red.jpg 
",
         "https://issues.apache.org/jira/secure/attachment/12394350/solr.s4.jpg 
",
         "https://issues.apache.org/jira/secure/attachment/12394376/solr_sp.png 
",
         "https://issues.apache.org/jira/secure/attachment/12394267/apache_solr_c_blue.jpg 
"
       },
// LATE VOTE
//      {
//        "https://issues.apache.org/jira/secure/attachment/12394268/apache_solr_c_red.jpg 
",
//        "https://issues.apache.org/jira/secure/attachment/12394282/solr2_maho_impression.png 
",
//        "https://issues.apache.org/jira/secure/attachment/12394267/apache_solr_c_blue.jpg 
"
//      }
     };

     Map<String,Entry> votes = new HashMap<String, Entry>();

     for( String[] cast : v ) {
       int value = 5;
       for( String u : cast ) {
         Entry entry = votes.get( u );
         if( entry == null ) {
           entry = new Entry();
           entry.url = u;
           votes.put( u, entry );
         }
         entry.votes++;
         entry.score += value--;
       }
     }

     // go through each vote and remove:
     //

     // Toss out any votes for: solr2_maho_impression.png
     // but make the next vote #1
     List<List<String>> normalized = new ArrayList<List<String>>();
     for( String[] cast : v ) {
       List<String> pref = new ArrayList<String>();
       for( String u : cast ) {
         if( !"https://issues.apache.org/jira/secure/attachment/12394282/solr2_maho_impression.png 
".equals( u ) ) {
           pref.add( u );
         }
       }
       if( !pref.isEmpty() ) {
         normalized.add( pref );
       }
     }

     List<Entry> past = new ArrayList<Entry>();
     int quota = (normalized.size()/2)+1;
     for( int round=0; round<7&&past.isEmpty(); round++ ){
      // System.out.println( "round:"+round );
       for( List<String> pref : normalized ) {
         if( pref.size() > round ) {
           Entry e = votes.get( pref.get( round ) ); // should not be  
null
           e.stv++;
           if( round == 0 ) {
             e.first = e.stv;
           }
         }
       }

       // check if anyone is past the quota
       for( Entry e : votes.values() ) {
         if( e.stv >= quota ) {
           past.add( e );
         }
       }
     }

     List<Entry> entries = new LinkedList<Entry>();
     entries.addAll( votes.values() );

     PrintStream out = System.out;
     out.println( "<html><body>" );

     Collections.sort( entries, new PropertyComparator( "votes", true,  
false ) );
     out.println( "<h1>Sorted by number of votes</h1>" );
     writeTable( entries, out );

     Collections.sort( entries, new PropertyComparator( "score", true,  
false ) );
     out.println( "<h1>Sorted by score</h1>" );
     writeTable( entries, out );

     Collections.sort( entries, new PropertyComparator( "stv", true,  
false ) );
     out.println( "<h1>Sorted by Single transferable vote.  Quota:  
"+quota+"</h1>" );
     String u = "http://en.wikipedia.org/wiki/Single_transferable_vote";
     out.println( String.format("<a href=\"%s\">%s</a>",u,u) );
     writeTable( entries, out );

     Collections.sort( entries, new PropertyComparator( "first", true,  
false ) );
     out.println( "<h1>Sorted by first (excluding  
solr2_maho_impression.png)</h1>" );
     writeTable( entries, out );

     // Now use Instant-runoff voting
     Set<String> eliminated = new HashSet<String>();
     int majority = normalized.size() / 2;
     out.println( "<h1>Instant-runoff voting</h1>" );
     out.println( "<pre>" );
     Entry winner = null;
     for( int round=1; winner == null; round++ ) {
       Map<String,Entry> inRunning = new HashMap<String, Entry>();
       for( Entry e : votes.values() )  {
         if( !eliminated.contains( e.url ) ) {
           e.votes = 0;
           inRunning.put( e.url, e );
         }
       }
       out.println( "round: "+round );
       out.println( "entries: "+inRunning.size() );
       if( inRunning.isEmpty() ) {
         out.println( "finished with no winner." );
         break;
       }

       // Give each person a vote for the top remaing canidate
       for( List<String> pref : normalized ) {
         for( String p : pref ) {
           Entry e = inRunning.get( p );
           if( e != null ) {
             e.votes++;
             break;
           }
         }
       }

       // Check if anyone has a majority
       for( Entry e : inRunning.values() ) {
         if( e.votes > majority ) {
           winner = e;  // can't have two with a majority
         }
       }

       // remove the lowest score
       entries.clear();
       entries.addAll( inRunning.values() );
       Collections.sort( entries, new PropertyComparator( "votes",  
true, true ) );
       int lowestscore = entries.get( 0 ).votes;
       for( Entry e : entries ) {
         if( e.votes == lowestscore ) {
           eliminated.add( e.url );
           out.println( "eliminating ("+lowestscore+") "+e.url );
         }
       }
     }
     out.println("</pre>");

     out.println( "</body></html>" );
   }

   void writeTable( Collection<Entry> entries, PrintStream out ) {
     out.println( "<table border=1 cellpadding=20>" );
     for( Entry entry : entries ) {
       out.println( "<tr valign=\"top\">" );
       out.println( String.format( "<td>votes: %d<br/>score: %d<br/
 >stv: %d<br/>first: %d",
             entry.votes, entry.score, entry.stv, entry.first  ) );
       out.println( String.format( "<td><img src=\"%s\" /></td>",  
entry.url  ) );
       out.println( "</tr>" );
     }
     out.println( "</table>" );
     out.println( "<br/><br/>" );
   }



On Dec 10, 2008, at 4:59 PM, Mike Klaas wrote:

>
> On 10-Dec-08, at 12:41 PM, Yonik Seeley wrote:
>>>>
>>>> Sure thing.
>>>
>>> I take it that there are no objections?  If so, I'll call a vote  
>>> by the end
>>> of the week.
>>
>> +1
>> I just wish we had used this method with the community vote.
>>
>> I guess as a committer I should try and figure out what order the
>> community would have voted and do that.
>
> I could run the results of the community vote interpreted as STV, if  
> that would help (it'll be a few days, though).
>
> -Mike

Reply | Threaded
Open this post in threaded view
|

Re: logo contest

hossman

: There you go.  clear as mud!

: As I see it, we either call a new community poll -- nothing in the rules says
: we can't.  or vote on:

FWIW: My opinion hasn't really changed since i said...

>> committers should cast their votes as they feel appropriate to best
>> serve the interests of the community -- it's not really different then
>> voting on an implementation approach for a feature, or what logging
>> framework to use, or a decisison to switch from java 1.5 to 1.6 ... we
>> have to make a subjective decision based on the feedback we've observed
>> from the community as a whole (with solr-logo-results.html serving as
>> our cliff notes)

... i suggest we move forward with a straight STV/IRV based vote of
committers (if anyone was going to VETO a submission i'm sure they would
have done it by now) and let individual committers rank things the way
they feel best represents the wishes of community.  since we have to
subjectively interpret the community vote, let's apply individual
subjective interpretations and aggregate them (in line with the orriginal
contest rules) instead of picking one arbitrary subjective interpretation
and then voting +1.

If we can't trust ourselves to represent the community fairly on picking
a logo, we have no business committing any code.




-Hoss

12