You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

submitWithConfiguration.m 3.8 kB

8 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. function submitWithConfiguration(conf)
  2. addpath('./lib/jsonlab');
  3. parts = parts(conf);
  4. fprintf('== Submitting solutions | %s...\n', conf.itemName);
  5. tokenFile = 'token.mat';
  6. if exist(tokenFile, 'file')
  7. load(tokenFile);
  8. [email token] = promptToken(email, token, tokenFile);
  9. else
  10. [email token] = promptToken('', '', tokenFile);
  11. end
  12. if isempty(token)
  13. fprintf('!! Submission Cancelled\n');
  14. return
  15. end
  16. try
  17. response = submitParts(conf, email, token, parts);
  18. catch
  19. e = lasterror();
  20. fprintf( ...
  21. '!! Submission failed: unexpected error: %s\n', ...
  22. e.message);
  23. fprintf('!! Please try again later.\n');
  24. return
  25. end
  26. if isfield(response, 'errorMessage')
  27. fprintf('!! Submission failed: %s\n', response.errorMessage);
  28. else
  29. showFeedback(parts, response);
  30. save(tokenFile, 'email', 'token');
  31. end
  32. end
  33. function [email token] = promptToken(email, existingToken, tokenFile)
  34. if (~isempty(email) && ~isempty(existingToken))
  35. prompt = sprintf( ...
  36. 'Use token from last successful submission (%s)? (Y/n): ', ...
  37. email);
  38. reenter = input(prompt, 's');
  39. if (isempty(reenter) || reenter(1) == 'Y' || reenter(1) == 'y')
  40. token = existingToken;
  41. return;
  42. else
  43. delete(tokenFile);
  44. end
  45. end
  46. email = input('Login (email address): ', 's');
  47. token = input('Token: ', 's');
  48. end
  49. function isValid = isValidPartOptionIndex(partOptions, i)
  50. isValid = (~isempty(i)) && (1 <= i) && (i <= numel(partOptions));
  51. end
  52. function response = submitParts(conf, email, token, parts)
  53. body = makePostBody(conf, email, token, parts);
  54. submissionUrl = submissionUrl();
  55. params = {'jsonBody', body};
  56. [code, responseBody] = system(sprintf('echo jsonBody=%s | curl -k -X POST -d @- %s', body, submissionUrl));
  57. response = loadjson(responseBody);
  58. end
  59. function body = makePostBody(conf, email, token, parts)
  60. bodyStruct.assignmentSlug = conf.assignmentSlug;
  61. bodyStruct.submitterEmail = email;
  62. bodyStruct.secret = token;
  63. bodyStruct.parts = makePartsStruct(conf, parts);
  64. opt.Compact = 1;
  65. body = savejson('', bodyStruct, opt);
  66. end
  67. function partsStruct = makePartsStruct(conf, parts)
  68. for part = parts
  69. partId = part{:}.id;
  70. fieldName = makeValidFieldName(partId);
  71. outputStruct.output = conf.output(partId);
  72. partsStruct.(fieldName) = outputStruct;
  73. end
  74. end
  75. function [parts] = parts(conf)
  76. parts = {};
  77. for partArray = conf.partArrays
  78. part.id = partArray{:}{1};
  79. part.sourceFiles = partArray{:}{2};
  80. part.name = partArray{:}{3};
  81. parts{end + 1} = part;
  82. end
  83. end
  84. function showFeedback(parts, response)
  85. fprintf('== \n');
  86. fprintf('== %43s | %9s | %-s\n', 'Part Name', 'Score', 'Feedback');
  87. fprintf('== %43s | %9s | %-s\n', '---------', '-----', '--------');
  88. for part = parts
  89. score = '';
  90. partFeedback = '';
  91. partFeedback = response.partFeedbacks.(makeValidFieldName(part{:}.id));
  92. partEvaluation = response.partEvaluations.(makeValidFieldName(part{:}.id));
  93. score = sprintf('%d / %3d', partEvaluation.score, partEvaluation.maxScore);
  94. fprintf('== %43s | %9s | %-s\n', part{:}.name, score, partFeedback);
  95. end
  96. evaluation = response.evaluation;
  97. totalScore = sprintf('%d / %d', evaluation.score, evaluation.maxScore);
  98. fprintf('== --------------------------------\n');
  99. fprintf('== %43s | %9s | %-s\n', '', totalScore, '');
  100. fprintf('== \n');
  101. end
  102. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  103. %
  104. % Service configuration
  105. %
  106. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  107. function submissionUrl = submissionUrl()
  108. submissionUrl = 'https://www-origin.coursera.org/api/onDemandProgrammingImmediateFormSubmissions.v1';
  109. end

机器学习