Unless you spent the last 6 months deep in a cave, you must have heard buzz about the Microsoft Solver Foundation. It is much less likely however that you've heard about OptimJ. That's a major difference between being Microsoft or being Ateji.
In the pure Microsoft tradition, this vaporware has already generated far more downloads and excitation than OptimJ, an existing and proven product acclaimed by our users. Everybody in the OR community is pretending that they're not concerned or worried by the MSF announcement, but have anyway downloaded a large .msi archive "just in case". And the blogosphere is buzzing with wild guesses about what's really inside (do you know how to open an .msi archive ? most of them don't know either, but who cares).
Effects of carpet-bombing marketing are also visible in everything related to the forthcoming ICS'09 conference. I have yet to see any conference-related announcement without the "M" word. And almost all sponsorship opportunities are already bought and reserved by this single company. Maybe the Ateji team will end up on the side-walk distributing flyers from a makeshift cardboard tent (it may be cold in January, we'll exchange marketing material for warm soup).
So what's Ateji to do in this context ? We cannot afford a carpet-bombing marketing strategy, and vaporware announcements are not an option. Clients expect us to deliver first.
What we can do, however, is to leverage all this buzz-making to spread the word about what we've been promoting for long. The vaporware strategy is typically an attempt at delaying competitor's sales. Hairy-pointed bosses will prefer to wait until Microsoft actually delivers anything usable, and we'll lose those sales. But many others will have a chance to look at our product and download right now a fully functional version, so all in all we expect a big boost for Ateji. Time will tell.
But the best bit is about self-satisfaction. The fact that Microsoft is following a similar embedded-language approach applied to optimization reassures me that we choose the right approach when we founded Ateji three years ago.
Thursday, October 23, 2008
Sunday, June 15, 2008
Common Idioms 2
Associative arrays are one of the driving force behind the adoption of so-called scripting languages such as JavaScript or Ruby. Strangely enough, they're absent from the mainstream generalist languages of the C++/C#/Java family.
Associative arrays are like standard arrays but can be indexed with any given collection of values (whereas Java arrays can only be indexed with 0-based integers). Alternatively, associative arrays can be thought of as maps with built-in language support and a fixed an immutable set of keys (refering to a non-existent key raises an ArrayIndexOutOfBoundsException). Here is the OptimJ version of the canonical example from Wikipedia :
Notice the type String[String] that denotes an array of strings indexed by strings.
To see how associative arrays differ from Java arrays, consider the two definitions :
Here a1 is indexed by 0, 1, 2 and a2 is indexed by 3, 7, 12. Note how their types are different.
Java and associative array dimensions can be mixed freely:
a is a 3-dimensional array. The first dimension is associative, indexed by doubles. The second dimension is a Java array dimension, indexed by 0-based integers. The third dimension is associative, indexed by strings.
As usual in Java, an array index expression is written with indices in the opposite order of the types:
Associative arrays are common in algebraic modeling languages such as AMPL, GAMS, OPL, etc., where they allow for a concise and mathematical-like expression of optimization problems.
Associative arrays are like standard arrays but can be indexed with any given collection of values (whereas Java arrays can only be indexed with 0-based integers). Alternatively, associative arrays can be thought of as maps with built-in language support and a fixed an immutable set of keys (refering to a non-existent key raises an ArrayIndexOutOfBoundsException). Here is the OptimJ version of the canonical example from Wikipedia :
String[String] phoneBook = {
"Sally Smart" -> "555-9999",
"John Doe" -> "555-1212",
"J. Random Hacker" -> "553-1337"
};
// iterate over the values
for(String number : phoneBook) {
System.out.println(number);
}
// iterate over the keys
for(String name : phoneBook.keys) {
System.out.println(name + " -> " + phoneBook[name]);
}
"Sally Smart" -> "555-9999",
"John Doe" -> "555-1212",
"J. Random Hacker" -> "553-1337"
};
// iterate over the values
for(String number : phoneBook) {
System.out.println(number);
}
// iterate over the keys
for(String name : phoneBook.keys) {
System.out.println(name + " -> " + phoneBook[name]);
}
Notice the type String[String] that denotes an array of strings indexed by strings.
To see how associative arrays differ from Java arrays, consider the two definitions :
String[] a1 = { "a", "b", "c" };
String[int] a2 = { 12 -> "a", 3 -> "b", 7 -> "c" };
String[int] a2 = { 12 -> "a", 3 -> "b", 7 -> "c" };
Here a1 is indexed by 0, 1, 2 and a2 is indexed by 3, 7, 12. Note how their types are different.
Java and associative array dimensions can be mixed freely:
int[String][][double] a;
a is a 3-dimensional array. The first dimension is associative, indexed by doubles. The second dimension is a Java array dimension, indexed by 0-based integers. The third dimension is associative, indexed by strings.
As usual in Java, an array index expression is written with indices in the opposite order of the types:
a[3.1416][10]["abc"]
Associative arrays are common in algebraic modeling languages such as AMPL, GAMS, OPL, etc., where they allow for a concise and mathematical-like expression of optimization problems.
Sunday, June 8, 2008
Common Idioms 1
Most mainstream programming languages are pretty bad at initializating and populating structured data. Let's say you want a Java list containing "a" and "b".
First attempt :
Pretty bad signal-to-noise ratio.
Second attempt :
Slightly more readable, but allocates a useless intermediate array.
Third attempt :
Much more readable, but doesn't work if you want a set rather than a list : there's no
Here's the OptimJ version :
But nausea quickly kicks in when you try to instanciate imbricated collection. A cooking recipe may be seen as a list (ordered) of sets of tasks (unordered because they can be done in parallel).
First attempt :
Wow! This is called write-only code. Think about having to maintain pages of similar code written by an summer intern two years ago.
Second attempt :
The
Here's the OptimJ version :
Do you feel more confident now taking this code maintenance assignment ?
First attempt :
List<String> a = new ArrayList<String>();
a.add("1");
a.add("2");
a.add("1");
a.add("2");
Pretty bad signal-to-noise ratio.
Second attempt :
List<String> a = Arrays.asList(new String[]{ "a", "b" });
Slightly more readable, but allocates a useless intermediate array.
Third attempt :
List<String> a = Arrays.asList("a", "b");
Much more readable, but doesn't work if you want a set rather than a list : there's no
Arrays.asSet()
.Here's the OptimJ version :
ArrayList<String> a = { "a", "b" };
HashSet<String> s = { "a", "b" };
HashSet<String> s = { "a", "b" };
But nausea quickly kicks in when you try to instanciate imbricated collection. A cooking recipe may be seen as a list (ordered) of sets of tasks (unordered because they can be done in parallel).
First attempt :
List<Hashset<String>> irishStew = new ArrayList<Hashset <String>>();
HashSet<String> set1 = new HashSet<String>();
set1.add("Mince the meet");
set1.add("Mash the potatoes");
irishStew.add(set1);
HashSet<String> set2 = new HashSet<String>();
set2.add("Cook in oven");
irishStew.add(set2);
HashSet<String> set1 = new HashSet<String>();
set1.add("Mince the meet");
set1.add("Mash the potatoes");
irishStew.add(set1);
HashSet<String> set2 = new HashSet<String>();
set2.add("Cook in oven");
irishStew.add(set2);
Wow! This is called write-only code. Think about having to maintain pages of similar code written by an summer intern two years ago.
Second attempt :
... ?
The
asList
doesn't work because it requires expressions, and the code that builds our sets is a sequence of statements, not an expression.Here's the OptimJ version :
ArrayList<HashSet<String>> irishStew = {
{ "Mince the meet", "Mash the potatoes" },
{ "Cook in oven"}
};
{ "Mince the meet", "Mash the potatoes" },
{ "Cook in oven"}
};
Do you feel more confident now taking this code maintenance assignment ?
Monday, April 28, 2008
Ateji supports the Roadef challenge
Every two years, the French Operational Research and Decision Support Society (ROADEF) organizes an OR challenge dedicated to industrial applications, in collaboration with an industrial partner. This year, the challenge is proposed by Amadeus and deals with disruption management for commercial aviation. It is open to everyone and provides a fantastic opportunity to match theory and practice: do not miss this chance to demonstrate your talent.
Ateji provides OptimJ licences for the duration of the challenge to all participants (contact us if you need one), and will offer a commercial full-featured OptimJ licence to the winner.
This year's topic is challenging in both data modeling and optimization modeling. Since OptimJ seamlessly integrates both aspects, it can save you a large amount of boring coding time that you'll be able to spend instead on creative thinking. Good luck!
Ateji provides OptimJ licences for the duration of the challenge to all participants (contact us if you need one), and will offer a commercial full-featured OptimJ licence to the winner.
This year's topic is challenging in both data modeling and optimization modeling. Since OptimJ seamlessly integrates both aspects, it can save you a large amount of boring coding time that you'll be able to spend instead on creative thinking. Good luck!
Friday, April 4, 2008
Top 10 reasons to invest in a french technology venture
- Whenever you feel like spending a romantic week-end in Paris, pretend to have an urgent board meeting.
- Paris is home to a large number of brilliant universities and grandes ecoles, with no shortage of talented people coming from all over Europe.
- French VCs are a following trend, they'll courteously let you pick the nicest jewels first.
- The french still learn engineering at school.
- Public policy is strongly favoring entrepreneurship and foreign investment (see www.invest-in-france.org)
- You will find here truly original projects with a sound industrial vision, not just the 10,001th copycat startup.
- It wouldn't hurt to have a few assets in euros in your portfolio.
- We're too far away ? Have you ever used Skype ?
- Despite rumours to the contrary, the term "entrepreneur" is a loanword from French (en.wikipedia.org/wiki/Entrepreneur)
- There is life outside the Valley. Have a look.