Changes FitnessStatsCSVProbe to use csvwriter like AttributesCSVProbe. This makes it more resilient against weirder edge cases of the CSV file format that are already handled by the standard library.
Also changes the aggregation functions to be applied over axis 0. For normal fitnesses this behaves as before. For multiobjective fitnesses, this aggregates on a per-objective basis. While I can't imagine a use case, this should also work for multidimensional, multiobjective fitnesses.
Fixes #261
Changes FitnessStatsCSVProbe to use csvwriter like AttributesCSVProbe. This makes it more resilient against weirder edge cases of the CSV file format that are already handled by the standard library.
Also changes the aggregation functions to be applied over axis 0. For normal fitnesses this behaves as before. For multiobjective fitnesses, this aggregates on a per-objective basis. While I can't imagine a use case, this should also work for multidimensional, multiobjective fitnesses.