Công cụ tái tạo tốt nhất là tạo nhật ký hành động của bạn, đại loại như thế này:
experiment/input ; expected ; observation/output ; current hypothesis and if supported or rejected
exp1 ; expected1 ; obs1 ; some fancy hypothesis, supported
Điều này có thể được viết ra giấy, nhưng, nếu các thử nghiệm của bạn phù hợp với khung tính toán, bạn có thể sử dụng các công cụ tính toán để tự động hóa một phần hoặc hoàn toàn quá trình ghi nhật ký đó (đặc biệt là bằng cách giúp bạn theo dõi các bộ dữ liệu đầu vào có thể rất lớn và đầu ra số liệu).
Một công cụ tái tạo tuyệt vời cho Python với đường cong học tập thấp dĩ nhiên là IPython / Jupyter Notebook (đừng quên các phép thuật % logon và% logstart ). Mẹo: để đảm bảo máy tính xách tay của bạn có thể tái tạo được, hãy khởi động lại kernel và thử chạy tất cả các ô từ trên xuống dưới (nút Run All Cells): nếu nó hoạt động, thì hãy lưu mọi thứ trong tệp lưu trữ ("đóng băng"), khác, đáng chú ý nếu bạn cần chạy các ô theo kiểu phi tuyến tính và không tuần tự và không rõ ràng để tránh lỗi, bạn cần làm lại một chút.
Một công cụ tuyệt vời mà là rất gần đây (2015) là recipy , rất giống như sumatra (xem dưới đây), nhưng thực hiện cụ thể cho Python. Tôi không biết nếu nó hoạt động với Jupyter Notebooks, nhưng tôi biết tác giả thường xuyên sử dụng chúng vì vậy tôi đoán rằng nếu nó hiện không được hỗ trợ, nó sẽ có trong tương lai.
Git cũng tuyệt vời và nó không bị ràng buộc với Python. Nó sẽ giúp bạn không chỉ lưu giữ lịch sử của tất cả các thử nghiệm, mã, bộ dữ liệu, số liệu, v.v. mà còn cung cấp cho bạn các công cụ để duy trì ( git pickaxe ), cộng tác ( đổ lỗi ) và gỡ lỗi ( git - bisect ) bằng cách sử dụng một khoa học phương pháp gỡ lỗi (gọi là gỡ lỗi delta ). Đây là một câu chuyện về một nhà nghiên cứu hư cấu đang cố gắng tạo ra hệ thống ghi nhật ký thí nghiệm của riêng mình, cho đến khi nó kết thúc bằng một bản fax của Git.
Một công cụ nói chung làm việc với bất kỳ ngôn ngữ (với một API Python trên pypi ) là Sumatra , được thiết kế đặc biệt để giúp bạn làm nhân rộng nghiên cứu ( có thể nhân rộng nhằm mục đích để tạo ra kết quả tương tự cho cùng một mã chính xác và phần mềm, trong khi tái lập mục tiêu để sản xuất kết quả tương tự được đưa ra cho bất kỳ phương tiện nào, khó hơn rất nhiều và tốn thời gian và không thể tự động hóa).
Đây là cách Sumatra hoạt động: đối với mỗi thử nghiệm mà bạn thực hiện thông qua Sumatra, phần mềm này sẽ hoạt động giống như một "trạng thái trò chơi lưu" thường thấy trong các trò chơi video. Chính xác hơn, nó sẽ tiết kiệm:
- tất cả các thông số bạn cung cấp;
- trạng thái mã nguồn chính xác của toàn bộ ứng dụng và tệp cấu hình thử nghiệm của bạn;
- đầu ra / lô / kết quả và bất kỳ tệp nào được tạo bởi ứng dụng thử nghiệm của bạn.
Sau đó, nó sẽ xây dựng một cơ sở dữ liệu với dấu thời gian và các metadatas khác cho mỗi thử nghiệm của bạn, sau đó bạn có thể thu thập dữ liệu bằng cách sử dụng webGUI. Vì Sumatra đã lưu toàn bộ trạng thái ứng dụng của bạn cho một thử nghiệm cụ thể tại một thời điểm cụ thể, bạn có thể khôi phục mã tạo ra kết quả cụ thể bất cứ lúc nào bạn muốn, do đó bạn có thể nghiên cứu có thể sao chép với chi phí thấp (ngoại trừ lưu trữ nếu bạn làm việc trên các bộ dữ liệu khổng lồ, nhưng bạn có thể định cấu hình các ngoại lệ nếu bạn không muốn lưu mọi thứ mọi lúc).
Một công cụ tuyệt vời khác là Zeitgeist của Gnome (trước đây được mã hóa bằng Python nhưng giờ đã được chuyển sang Vala), một hệ thống nhật ký hành động toàn năng, ghi lại mọi thứ bạn làm và nó có thể sử dụng máy học để tóm tắt trong một khoảng thời gian bạn muốn có mối quan hệ giữa các mục về sự giống nhau và mô hình sử dụng, ví dụ như trả lời các câu hỏi như "Điều gì phù hợp nhất với tôi, trong khi tôi đang làm việc trong dự án X, trong một tháng năm ngoái?" . Thật thú vị, Zim Desktop Wiki , một ứng dụng ghi chú tương tự như Evernote, có một plugin để hoạt động với Zeitgeist.
Cuối cùng, bạn có thể sử dụng Git hoặc Sumatra hoặc bất kỳ phần mềm nào khác mà bạn muốn, chúng sẽ cung cấp cho bạn khả năng nhân rộng tương tự, nhưng Sumatra được thiết kế riêng cho nghiên cứu khoa học để cung cấp một vài công cụ ưa thích như GUI web để thu thập dữ liệu kết quả của bạn, trong khi Git phù hợp hơn với bảo trì mã (nhưng nó có các công cụ gỡ lỗi như git-bisect vì vậy nếu các thử nghiệm của bạn liên quan đến mã, nó thực sự có thể tốt hơn). Hoặc tất nhiên bạn có thể sử dụng cả hai!
/ EDIT: DSign đã chạm đến một điểm rất quan trọng ở đây: khả năng sao chép thiết lập của bạn cũng quan trọng như khả năng nhân rộng của ứng dụng của bạn. Nói cách khác, ít nhất bạn nên cung cấp một danh sách đầy đủ các thư viện và trình biên dịch mà bạn đã sử dụng cùng với các phiên bản chính xác của chúng và các chi tiết về nền tảng của bạn .
Cá nhân, trong điện toán khoa học với Python, tôi đã thấy rằng việc đóng gói một ứng dụng cùng với các thư viện là quá đau đớn, vì vậy bây giờ tôi chỉ sử dụng gói python khoa học tất cả trong một như Anaconda (với conda trình quản lý gói tuyệt vời ), và chỉ khuyên người dùng sử dụng cùng một gói. Một giải pháp khác có thể là cung cấp một tập lệnh để tự động tạo virtualenv hoặc đóng gói mọi thứ bằng ứng dụng Docker thương mại như được trích dẫn bởi dsign hoặc Vagrant mã nguồn mở (ví dụ như pylearn2-in-a-box sử dụng Vagrant để có thể phân phối lại dễ dàng gói môi trường ảo).
Cuối cùng, để thực sự đảm bảo rằng bạn có một môi trường làm việc đầy đủ mọi lúc bạn cần, bạn có thể tạo một máy ảo (xem VirtualBox) và thậm chí bạn có thể lưu trạng thái của máy (ảnh chụp nhanh) với thử nghiệm của bạn sẵn sàng để chạy bên trong. Sau đó, bạn chỉ có thể chia sẻ máy ảo này với mọi thứ được bao gồm để bất kỳ ai cũng có thể sao chép thử nghiệm của bạn với thiết lập chính xác của bạn. Đây có lẽ là cách tốt nhất để sao chép một thử nghiệm dựa trên phần mềm. Các container có thể là một sự thay thế nhẹ hơn, nhưng chúng không bao gồm toàn bộ môi trường, do đó độ trung thực của bản sao sẽ kém mạnh mẽ hơn.
/ EDIT2: Đây là một video tóm tắt tuyệt vời (để gỡ lỗi nhưng điều này cũng có thể được áp dụng cho nghiên cứu) điều cơ bản để thực hiện nghiên cứu có thể tái tạo: ghi lại các thí nghiệm của bạn và từng bước khác của phương pháp khoa học, một loại "thử nghiệm rõ ràng" .